(1)atomic:提供线程安全,是防止在写未完成的时候被另一个线程读取,造成数据错误(即阻止两个线程同时更新一个值)。
(2)non-atomic:在自己管理的内存环境中,解析的访问器保留并自动释放返回的值,如果指定了nonatomic,那么访问器只是简单的返回这个值。
但是,原子属性存在开销,所以过度使用它们并不明智。例如,如果能够保证某个属性在任何时刻都不会被多个线程访问,那最好还是将其标记为nonatomic,我们平常在开发时基本上都是使用nonatomic,原因有两个
1.因为UIKit只允许在主线程中操纵UI元素,由于只会在指定的线程内进行访问,除了带来开销,将属性设置为atomic不会带来任何价值
2.即使属性被设置为atomic, 其也不一定是线程安全的。例如,如果定义属性NSInteger i是原子的,对i进行i = i +1;操作就是不安全的,因为原子性只能保证读写安全,而该表达式需要三步操作
(1)读取i的值存入寄存器
(2)将i加1
(3)修改i的值
如果在第1步完成的时候i被其他线程修改了,那么表达式执行的结果就会和预期的不一样,也就是不安全的。
网友评论