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