1

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

是否有文档(或源代码)参考显示属性如何合成的所有不同排列(取决于属性、assign、等)?retain

4

2 回答 2

2

我无法想象分配设置器首先检查以前的值。这将完全浪费 CPU 周期,因为无论哪种方式结果都是一样的。该文档明确说明了各种属性的语义,但并未准确显示合成了哪些代码。

于 2011-11-03T17:52:43.770 回答
1

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;
于 2011-11-03T17:50:35.973 回答