atomic 和nonatomic的主要区别是系统主动生成的getter/setter方法不一样
atomic 系统主动生成的getter/setter方法会进行加锁操作
nonatimic系统主动生成的getter/setter方法不会主动进行加锁操作
atomic:
系统生成的getter/setter方法会进行加锁操作,这个所仅仅保证了getter和setter存取方法的线程安全
因为getter/setter方法加锁的缘故,所以在别的线程来读写这个属性之前,会先执行完当前操作
atomic是线性安全的吗?
不是,atomic仅仅是getter/setter方法进行了加锁操作,仅仅保证了读写是安安全的,并非真正意义上的线性安全,因为线性安全除了读写外还有其他操作
nonatomic:
系统生成的setter/getter方法没有加锁
线程不安全,但是更快
当多个线程访问同一个属性会出现无法预料的结果
内部实现:
nonatomic
//set
- (void)setIcon:(UIImage *)icon {
if(_icon != icon) {
_icon = icon;
}
}
//get
- (UIImage *)icon {
return _icon;
}
atomic
//set
- (void)setIcon:(UIImage *)icon {
//同步代码块
@synchronized (self) {
if(_icon1 != icon1) {
_icon1 = icon;
}
}
}
//get
- (UIImage *)icon {
UIImage *image = nil;
@synchronized(self) {
image = icon;
}
return image;
}