我想知道:iPhone开发中的所有属性都应该是nonatomic
吗?如果是这样,为什么?
答案 0 :(得分:9)
来自 Objective-C编程语言,必修指南:
您可以使用此属性指定访问者方法不是原子的。 (没有关键字来表示原子。)
nonatomic
指定访问者是非原子的。 默认情况下,访问者是原子的。
默认情况下,属性是原子的,因此合成访问器提供对多线程环境中属性的强大访问 - 也就是说,无论其他线程同时执行什么,始终完全检索或设置从getter返回的值或通过setter设置的值。 。有关详细信息,请参阅“Performance and Threading.”
如果指定retain
或copy
并且未指定nonatomic
,则在引用计数环境中,对象属性的合成get访问器使用锁定并保留和自动释放返回值 - 实现类似于以下内容:
[_internal lock]; // lock using an object-level lock
id result = [[value retain] autorelease];
[_internal unlock];
return result;
如果指定nonatomic
,则对象属性的合成访问器只是直接返回值。
答案 1 :(得分:6)
属性可以是atomic
或nonatomic
。
如果你声明一个nonatomic
属性,那么写入它会快得多,但它不会是线程安全的。
如果你声明一个atomic
属性,那么写作将是线程安全的,但它会慢得多(因为它必须同步它,所以没有其他人接触它)
答案 2 :(得分:1)
默认情况下,属性是原子的,除非您使用非原子关键字声明。这可确保在获取或设置其值时,多个线程不会访问该属性(尽管它不保证线程安全)。这种行为会带来性能损失。它在桌面上并不重要,但在iPhone上使用非原子是个好主意,因为你的处理器能力更有限,至少在你知道只会在主线程上使用的类上。
答案 3 :(得分:1)
性能损失并不是什么大不了但这就是当你想快速编写代码时“可写原子属性'名称'不能将合成的setter与用户定义的getter配对”,所以最好使用nonatomic,因为以后当你想要覆盖getter,它通常不需要覆盖的合成setter有问题。