我还在学习......,所以对于以下属性
@property (copy) NSNumber *foo;
副本到底做了什么?制作foo(的值)的副本并将其放到新的位置?就像复制构造函数一样?
并且还要澄清,以下基本上是在做一个AddRef,对吗?
@property (retain) NSNumber *foo;
答案 0 :(得分:1)
请在此处查看属性说明: http://cocoacast.com/?q=node/103
copy
表示为属性赋值将创建输入值的副本。
retain
表示您不会获得实际副本;你将获得相同的对象,并在其上留出额外的保留。因此,如果在其他地方进行了修改,您将在两个地方都看到修改。
对于NSNumber
,它们是不可变的,因此复制和保留在功能上是等效的。
答案 1 :(得分:0)
副本真的有用吗?
一般情况下,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];
}