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

时间:2011-05-24 19:28:41

标签: objective-c cocoa-touch ios properties

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

4 个答案:

答案 0 :(得分:9)

来自 Objective-C编程语言,必修指南:


原子性

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

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

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

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

[_internal lock]; // lock using an object-level lock
id result = [[value retain] autorelease];
[_internal unlock];
return result;

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

答案 1 :(得分:6)

属性可以是atomicnonatomic

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

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

答案 2 :(得分:1)

默认情况下,属性是原子的,除非您使用非原子关键字声明。这可确保在获取或设置其值时,多个线程不会访问该属性(尽管它不保证线程安全)。这种行为会带来性能损失。它在桌面上并不重要,但在iPhone上使用非原子是个好主意,因为你的处理器能力更有限,至少在你知道只会在主线程上使用的类上。

另见this question

答案 3 :(得分:1)

性能损失并不是什么大不了但这就是当你想快速编写代码时“可写原子属性'名称'不能将合成的setter与用户定义的getter配对”,所以最好使用nonatomic,因为以后当你想要覆盖getter,它通常不需要覆盖的合成setter有问题。