是否应将所有财产声明为"非原子"?

nya*_*nev 9 cocoa-touch properties objective-c ios

我想知道:iPhone开发中的所有属性应该是nonatomic什么?如果是这样,为什么?

sid*_*yll 9

来自Objective-C编程语言,强制性指南:


原子性

您可以使用此属性指定访问者方法不是原子的.(没有关键字来表示原子.)

nonatomic
指定访问者是非原子的.默认情况下,访问器是原子的.

默认情况下,属性是原子的,因此合成访问器提供对多线程环境中属性的强大访问 - 也就是说,无论其他线程同时执行什么,始终完全检索或设置从getter返回的值或通过setter设置的值.有关更多详细信息,请参阅"性能和线程".

如果指定retain或未copy指定nonatomic,则在引用计数环境中,对象属性的合成get访问器使用锁并保留并自动释放返回的值 - 实现将类似于以下内容:

[_internal lock]; // lock using an object-level lock
id result = [[value retain] autorelease];
[_internal unlock];
return result;
Run Code Online (Sandbox Code Playgroud)

如果指定nonatomic,则对象属性的合成访问器只是直接返回值.


arc*_*ght 6

属性可以是atomicnonatomic.

如果你声明一个nonatomic属性,那么写入它将会快得多,但它不会是线程安全的.

如果你声明一个atomic属性,那么写入将是线程安全的,但它会慢得多(因为它必须同步它,所以没有其他人接触它)

  • 不是真的,只写原子并不能确保属性是线程安全的!它只确保以原子方式写入/读取属性,这意味着当一个线程正在写入属性而另一个正在读取它时,读取线程不读取垃圾,因为另一个线程在此期间替换了该值. (5认同)