A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 执着的土豆 中级黑马   /  2015-4-7 21:00  /  2752 人查看  /  5 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

10黑马币
atomic 和nonatomic具体有区别。为什么说体现在线程上呢? 为什么推荐我们用nonatomic?

最佳答案

查看完整内容

atomic:原子属性,为setter方法加锁(默认就是atomic) nonatomic:非原子属性,不会为setter方法加锁 举个例子, 当你启动2个线程都去改变A的值,这时候第1个线程去访问A取回来的值是b,在他没写回A里面的时候,第2个线程去访问A还是b ,他们对b进行了2次操作,而用的值却都是b,所以这个时候要对A进行加锁操作 什么叫做为什么要禁止多线程? ...

5 个回复

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

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

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

什么叫做为什么要禁止多线程?
回复 使用道具 举报
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 ,那么访问器只是简单地返回这个值。  回答完毕,望采纳
回复 使用道具 举报
q594254132 发表于 2015-4-7 21:05
atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。
        atomic
                 ...

他的工作原理是什么?  为什么要禁止多线程呢?可否举例说一下。
回复 使用道具 举报
q594254132 发表于 2015-4-7 21:52
atomic:原子属性,为setter方法加锁(默认就是atomic)
nonatomic:非原子属性,不会为setter方法加锁

OK。我懂了。  3KS
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马