原子核非原子属性的选择
OC在定义属性时有nonatomic和atomic两种
atomic:原子属性,为setter方法加锁(默认就是atomic)
nonatomic:非原子属性,不会为setter方法加锁
nonatomic和atomic对比
atomic:线程安全,需要消耗大量的资源
nonatomic:非线性安全,适合内存小的移动设备
iOS开发建议
所有属性都声明为nonatomic
尽量避免多线程抢夺同一块资源
尽量将加锁/资源抢夺的业务逻辑交给服务器端处理,减小移动客户端的压力
线程间通信
什么叫做线程间通信
在1个进程中,线程往往不是孤立存在的,多个线程之间需要进行通信
1个线程传递数据给另1个线程
在1个线程中执行完特定任务后,转到另外一个线程中继续执行
线程间通信实例-图片线程
声明属性
在storyBoard拖UIImageView并关联属性
@property (weak,nonatomic) IBOulet UIImageView *imageView;
//在主线程下载图片计算下载图片消耗时间
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
//图片的网络路径
NSURL *url = [NSURL URLWithString:@"http://img.pconline.com.cn/images/photoblog/9/9/8/1/9981681/200910/11/1255259355826.jpg"];
//下载开始时间
NSDate *begin = [NSDate date];
//根据图片的网络路径去下载图片数据(比较耗时间)
NSData *data = [NSData dataWithContentsOfURL:url];
//下载结束时间
NSDate *end = [NSDate date];
//记录下载所花的时间
NSLog(@"%f",[end timeIntervalSinceDate:begin]);
//显示图片
self.imageView.image = [UIImage imageWithData:data];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
//[self download2];
//创建子线程,去子线程加载图片
[self performSelectorInBackground:@selector(download3) withObject:nil];
}
/在主线程下载图片计算下载图片消耗时间
- (void)download2{
//图片的网络路径
NSURL *url = [NSURL URLWithString:@"http://img.pconline.com.cn/images/photoblog/9/9/8/1/9981681/200910/11/1255259355826.jpg"];
//下载开始时间
CFTimeInterval begin = CFAbsoluteTimeGetCurrent();
//根据图片的网络路径去下载图片数据(比较耗
时间)
NSData *data = [NSData dataWithContentsOfURL:url];
//下载结束时刻的时间
CFTimeInterval end = CFAbsoluteTimeGetCurrent();
NSLog(@"%f",[end timeIntervalSinceDate:begin]);
//显示图片
self.imageView.image = [UIImage imageWithData:data];
}
- (void)download3{
//图片的网络路径
NSURL *url = [NSURL URLWithString:@"http://img.pconline.com.cn/images/photoblog/9/9/8/1/9981681/200910/11/1255259355826.jpg"];
//根据图片的网络路径去下载图片数据(比较耗
时间)
NSData *data = [NSData dataWithContentsOfURL:url];
//显示图片
UIImage *image = [UIImage imageWithData:data];
//回到主线程
//方法
//[self performSelectorOnMainThread: @selector(showImage:) withObject:image waitUntilDone: YES];
//方法2
//[self.imageView performSelectorOnMainThread:@selector(setImage:) withObject : image withUntilDone:NO];
//方法3
[self.imageView performSelector:@selector(setImage:) onThread:[NSThread mainThread] withObject: image waithUntilDone:NO];
}
//- (void) showImage:(UIImage *)image{
//self.imageView.image = image;
//}
//另外一种线程之间的通信
//NSPort;
//NSMessagePort;
//NSMachPort;