如何实现assign @ property的setter?

时间:2011-11-03 17:45:45

标签: objective-c properties getter-setter assign

在将ivar分配给新值之前,setter的实现是否首先检查新值是否与旧值不同?

是否有文档(或源代码)引用显示属性如何合成的所有不同排列(取决于属性assignretain等)?

2 个答案:

答案 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;