黑马程序员技术交流社区

标题: atomic 和nonatomic具体有区别 [打印本页]

作者: 执着的土豆    时间: 2015-4-7 21:00
标题: atomic 和nonatomic具体有区别
atomic 和nonatomic具体有区别。为什么说体现在线程上呢? 为什么推荐我们用nonatomic?

作者: q594254132    时间: 2015-4-7 21:00
执着的土豆 发表于 2015-4-7 21:36
他的工作原理是什么?  为什么要禁止多线程呢?可否举例说一下。

atomic:原子属性,为setter方法加锁(默认就是atomic)
nonatomic:非原子属性,不会为setter方法加锁

举个例子,
当你启动2个线程都去改变A的值,这时候第1个线程去访问A取回来的值是b,在他没写回A里面的时候,第2个线程去访问A还是b ,他们对b进行了2次操作,而用的值却都是b,所以这个时候要对A进行加锁操作

什么叫做为什么要禁止多线程?
作者: q594254132    时间: 2015-4-7 21:05
atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。
        atomic
                设置成员变量的@property属性时,默认为atomic,提供多线程安全。
                在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。加了atomic,setter函数会变成下面这样:
                        {lock}
                                if (property != newValue) {
                                        [property release];
                                        property = [newValue retain];
                                }
                        {unlock}
        nonatomic
        禁止多线程,变量保护,提高性能。
        atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。
        指出访问器不是原子操作,而默认地,访问器是原子操作。这也就是说,在多线程环境下,解析的访问器提供一个对属性的安全访问,从获取器得到的返回值或者通过设置器设置的值可以一次完成,即便是别的线程也正在对其进行访问。如果你不指定 nonatomic ,在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了 nonatomic ,那么访问器只是简单地返回这个值。  回答完毕,望采纳
作者: 执着的土豆    时间: 2015-4-7 21:36
q594254132 发表于 2015-4-7 21:05
atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。
        atomic
                 ...

他的工作原理是什么?  为什么要禁止多线程呢?可否举例说一下。
作者: 执着的土豆    时间: 2015-4-7 21:58
q594254132 发表于 2015-4-7 21:52
atomic:原子属性,为setter方法加锁(默认就是atomic)
nonatomic:非原子属性,不会为setter方法加锁

OK。我懂了。  3KS




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2