【发布时间】:2011-12-07 00:23:47
【问题描述】:
我还在学习...,所以对于以下属性
@property (copy) NSNumber *foo;
副本的真正作用是什么?复制 foo 的(值)并将其放到新位置?就像复制构造函数一样?
而且还要澄清一下,下面基本上是在做一个AddRef,对吧?
@property (retain) NSNumber *foo;
【问题讨论】:
标签: objective-c copy properties retain
我还在学习...,所以对于以下属性
@property (copy) NSNumber *foo;
副本的真正作用是什么?复制 foo 的(值)并将其放到新位置?就像复制构造函数一样?
而且还要澄清一下,下面基本上是在做一个AddRef,对吧?
@property (retain) NSNumber *foo;
【问题讨论】:
标签: objective-c copy properties retain
请参阅此处的属性说明: http://cocoacast.com/?q=node/103
copy 表示给属性赋值会复制输入值。
retain 表示您不会获得实际副本;你会得到相同的对象,上面有一个额外的保留。因此,如果它在其他地方进行了修改,您会在这两个地方看到修改。
对于NSNumbers,它们是不可变的,因此复制和保留在功能上是等效的。
【讨论】:
文案的真正作用是什么?
一般来说,NSNumber 是不可变的——我希望在这些情况下copy 将使用retain 实现:
- (id)copyWithZone:(NSZone*)zone {
return [self retain];
}
而且还要澄清一下,下面基本上是在做一个AddRef,对吧?
好吧,合成它会添加引用计数样板 - 实际操作更复杂并采用通用形式:
- (void)setFoo:(NSNumber *)arg {
NSNumber * prev = foo;
foo = [arg retain]; // << or foo = [arg copy]; if you have specified 'copy'
[prev release];
}
【讨论】:
@synchronized 实现。这是一个流行的误解——这也意味着 a) 使用 @synchronized 和 b) 期望原子属性实现也将使用它们的程序有许多并发设计错误等待被发现。 (续)