atomic:默认是有该属性的,这个属性是为了保证程序在多线程状况下,编译器会自动生成一些互斥加锁代码,避免该变量的读写不一样步问题。
nonatomic:若是该对象无需考虑多线程的状况,请加入这个属性,这样会让编译器少生成一些互斥加锁代码,能够提升效率。编程
atomic的意思就是setter/getter这个函数,是一个原语操做。若是有多个线程同时调用setter的话,不会出现某一个线程执行完setter所有语句以前,另外一个线程开始执行setter状况,至关于函数头尾加了锁同样,能够保证数据的完整性。nonatomic不保证setter/getter的原语行,因此你可能会取到不完整的东西。所以,在多线程的环境下原子操做是很是必要的,不然有可能会引发错误的结果。多线程
好比setter函数里面改变两个成员变量,若是你用nonatomic的话,getter可能会取到只更改了其中一个变量时候的状态,这样取到的东西会有问题,就是不完整的。固然若是不须要多线程支持的话,用nonatomic就够了,由于不涉及到线程锁的操做,因此它执行率相对快些。
函数
下面是载录的网上一段加了atomic的例子:atom
{lock}
if (property != newValue) {
[property release];
property = [newValue retain];
}
{unlock}spa
能够看出来,用atomic会在多线程的设值取值时加锁,中间的执行层是处于被保护的一种状态,atomic是oc使用的一种线程保护技术,基本上来说,就是防止在写入未完成的时候被另一个线程读取,形成数据错误。而这种机制是耗费系统资源的,因此在iPhone这种小型设备上,若是没有使用多线程间的通信编程,那么nonatomic是一个很是好的选择。线程