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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lijunyusmile 中级黑马   /  2016-7-13 00:17  /  1121 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我们声明属性的时候,必须要考虑到属性特质对编译器所产生的存取方法的影响。

下面我们就主要讲讲atomic 与 nonatomic:

在默认情况下,由编译器所合成的方法会通过锁定机制确保其原子性(atomicity)。如果属性具备nonatomic特质,则不需要同步锁。

请注意!!!!尽管没有名为atomic的特质(如果某属性不具备nonatomic特质,那它就是“原子的”(atomic)),但是仍然可以在属性特质中写明这一点,编译器是不会报错的。

那么atomic与nonatomic的区别又是什么捏?

之前说过滴,具备atomic特质的获取方法会通过锁定机制来确保其操作的原子性。

也就是说,如果两个线程同时读取一个属性,那么不论何时,总能看到有效的属性值。

如果不加锁的话(或者说使用nonatomic语义),那么当其中一个线程正在改写某属性值的时候,另外一个线程也许会突然闯入,把尚未修改好的属性值读取出来。发证这种情况时,线程读取道德属性值肯能不对。

相信大家都遇到过上述那种情况吧。。。。

一般iOS程序中,所有属性都声明为nonatomic。这样做的原因是:
在iOS中使用同步锁的开销比较大, 这会带来性能问题。一般情况下并不要求属性必须是“原子的”,因为这并不能保证“线程安全”(thread safety),若要实现“线程安全”的操作,还需采用更为深层的锁定机制才醒。

例如:一个线程在连续多次读取某个属性值的过程中有别的线程在同时改写该值,那么即便将属性声明为atomic,也还是会读取到不同的属性值。

因此,iOS程序一般都会使用nonatomic属性。但是在Mac OS X程序时, 使用atomic属性通常都不会有性能瓶颈

1 个回复

倒序浏览
说的不错 加油楼主
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马