个人用来记录知识点,以备查阅。若有疑问或者更好的见解,欢迎讨论。
若无特殊说明,涉及到的编程语言均为Objective-C。
1、atomic
和nonatomic
的异同
概述
atomic
和nonatomic
的主要区别是编译器为属性默认生成的setter/getter函数是否为原子操作。直观的看字面理解,atomic
是原子操作,nonatomic
是非原子操作。
详解
-
atomic
为系统默认的关键字,即不写时,默认为atomic,以下两种写法等效。
@property (atomic, retain) NSString *studentName;
@property (retain) NSString *studentName;
Objective-C中,属性(property)的atomic特性是采用自旋锁的方式实现,在运行时保证setter/getter方法的原子性。 而由于加锁,这种机制会耗费系统资源。
例如,有A、B两个线程都要调用setter时,或者A线程调用setter、B线程调用getter时,在A线程执行完setter全部语句之前,B线程必须等待,不会开始执行setter或者getter操作。
注意,atomic
并不能保证线程安全,它保证的只是setter/getter操作过程本身的原子性,即只能保证读写安全,若要实现真正的线程安全,只设置atomic
是不够的,需要借助其他手段。
例如,有A、B两个线程,A线程要依次调用setter方法和getter方法。在A线程调用setter方法后,B线程调用了一次setter方法,然后A线程再调用getter方法,则此时A线程得到的就不是本身期望的值,而是“错误”的数据。
-
nonatomic
需要显式填写。
@property (nonatomic, retain) NSString *studentName;
属性(property)的nonatomic
特性相对来说无需其他系统资源,因此效率更高。如果该属性无需考虑多线程的情况,请使用nonatomic
。
nonatomic
是线程不安全的,在多线程操作属性时,无法保证数据的完整性。
例如,有A、B、C三个线程,均需要多次调用setter方法和getter方法,有可能多个线程同时修改属性的值,则结果是无法预料的。
总结
atomic
- 系统默认关键字
- 读写安全,可以保证线程执行完当前读/写流程
- 效率低
nonatomic
- 不是系统默认的
- 线程不安全
- 效率更高
更多
Apple官方文档
Stack Overflow:What does the property “Nonatomic” mean?