atomic:系统会自动生成setter/getter方法会进行加锁的操作(锁仅仅保证setter/getter存取方法的线程安全).因为setter/getter方法有加锁的缘故,故在别的线程来读写这个属性之前,会执行完当前操作.
nonatomic:系统生成的getter/setter方法没有加锁(线程是不安全的,但更快).当多个线程同时访问同一个属性,会出现不可预料的结果.
区别:都说atomic是线程安全(实际是不准确的).atomic只是对属性的getter/setter方法进行了加锁操作.仅仅是对set/get的读写安全,并非真正意义上的线程安全.因为线程还有读写之外的其他操作(比如:当一个线程正在进行get/set操作时,又有另一个线程同时在进行release操作,可能会直接crash).
1.atomic和nonatomic用来决定编译器生成的getter/setter是否为原子操作.
2.atomic:系统生成的getter/setter会保证get,set操作的完整性,不受其他线程影响.getter 还是能得到一个完好无损的对象(可以保证数据的完整性),相当于函数头尾加了锁一样,每次只能有一个线程调用对象的setter方法,所以可以保证数据的完整性.
3.atomic所说的线程安全只是保证了getter和setter存取方法的线程安全,并不能保证整个对象是线程安全的。
4.nonatomic:就没有这个保证了,nonatomic返回你的对象可能就不是完整的value。因此,在多线程的环境下原子操作是非常必要的,否则有可能会引起错误的结果。但仅仅使用atomic并不会使得对象线程安全,我们还要为对象线程添加lock来确保线程的安全
5.nonatomic的速度要比atomic的快.
6.atomic与nonatomic的本质区别其实也就是在setter方法上的操作不同.
*atomic只是保证了getter/setter存取方法的线程安全.并不能保证整个对象是线程安全的,因此在多线程编程时,线程安全还需要开发者自己来处理.
*atomic系统生成的getter/setter会保证get/set操作的安全性,但相对nonatomic来说,atomic会更耗费资源,且速度要慢,故在iPhone等小型设备上,如果没有多线程之间的通讯,使用nonatomic是更好的选择.