将NSNumber变量声明为属性副本是什么意思

时间:2011-12-07 00:23:47

标签: objective-c copy properties retain

我还在学习......,所以对于以下属性

@property (copy) NSNumber *foo;

副本到底做了什么?制作foo(的值)的副本并将其放到新的位置?就像复制构造函数一样?

并且还要澄清,以下基本上是在做一个AddRef,对吗?

@property (retain) NSNumber *foo;

2 个答案:

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