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?

你可能感兴趣的:(2018-08-20 property的常用关键字分析(一))