2018-08-20 property的常用关键字分析(一)

个人用来记录知识点,以备查阅。若有疑问或者更好的见解,欢迎讨论。
若无特殊说明,涉及到的编程语言均为Objective-C。

1、atomicnonatomic的异同

概述

atomicnonatomic的主要区别是编译器为属性默认生成的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?

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容