在将ivar分配给新值之前,setter的实现是否首先检查新值是否与旧值不同?
是否有文档(或源代码)引用显示属性如何合成的所有不同排列(取决于属性assign
,retain
等)?
答案 0 :(得分:2)
我无法想象分配设置器首先检查先前的值。这将完全浪费CPU周期,因为结果将是相同的两种方式。文档明确说明了各种属性的语义,但它并未准确显示合成的代码。
答案 1 :(得分:1)
Objective-C文档解释了这一点。实际发生的细节是特定于实现的。
复制强>
指定应该使用对象的副本 分配。先前的值将发送一条释放消息。副本是 通过调用复制方法。此属性仅适用于 对象类型,必须实现NSCopying协议。指定强>
指定setter使用简单赋值。这个属性是 默认。您可以将此属性用于标量类型,例如NSInteger 和CGRect。<强>保留强>
指定应该在上面调用retain 转让时的对象。先前的值将发送一条释放消息。
...
<强>非原子强>
指定访问者是非原子的。默认情况下,访问者是原子的。
...
[_internal lock]; // lock using an object-level lock
id result = [[value retain] autorelease];
[_internal unlock];
return result;