代码改变世界

atomic和nonatomic的区别

2015-08-23 20:31  lvjun70  阅读(82)  评论(0)    收藏  举报

两者是用来决定编译器生成getter和setter是否为原子操作

设置成员变量@property属性的时候,默认为atomic,提供多线程安全。

在多线程的环境下,原子操作时必要的,否则有可能引起错误的结果,加了atomic,setter函数会变成如下:

{lock}

  if (property != newValue) {

    [property release];

    property = [newValue retain];

  }

  {unlock}

atomic时objective-c使用的一种线程保护技术,基本上讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制时耗费系统资源的,所以在iPhone这种小型设备上如果没有使用线程的通讯编程,那么nonatomic时一个非常好的选择

指出访问器不是原子操作,而默认的,访问是原子操作,也就是说,再多线程环境下,解析的访问器提供一个对属性的安全访问,从获取器得到的返回值或者通过设置器设置的值可以一次完成,即便是别的线程也在对其进行访问,如果你不指定nonatomic,在自己管理内存环境中,解析的访问器保留并自动释放返回值,如果指定了nonatomic,那么访问器知识简单的返回这个值