在Objective-C中,property默认是atomic的。官方文档描述:设置原子性,通过setter和getter方法对数据进行读写时可以保证数据的准确性。setter和getter方法在进行读写操作时会先进行加锁的动作,等操作完成之后再解锁,这样就保证的读写数据的完整性。但是原子性不等同于对象的线程安全,若要实现“线程安全”的操作,还需采用更为深层的锁定机制才行。例如,一个线程在连续多次读取某属性值的过程中有别的线程在同时改写该值,那么即便将属性声明为atomic,也还是会读到不同的属性值。而且在iOS中使用同步锁的开销较大,这会带来性能问题。
nonatomic的内存管理语义是非原子性的,非原子性的操作本来就是线程不安全,当对象无需考虑多线程的情况时使用,而且nonatomic不使用同步锁,效率高。
atomic 和 nonatomic 的区别在于,系统自动生成的 getter/setter 方法不一样。如果你自己写 getter/setter,那 atomic/nonatomic/retain/assign/copy 这些关键字只起提示作用,写不写都一样