类复制其他类的NSArray并明确拥有它

时间:2012-03-30 05:49:00

标签: objective-c

我想确保理解属性的关键概念和类的实例变量所有权,在本例中使用NSArray。

假设我将对NSArray的引用传递给另一个类,并将该类的iVar设置为它。例如:

第一项技术

OtherClass.h

@property (nonatomic, retain) NSArray * otherClassArray;

然后:

CurrentClass.m

otherclass.otherClassArray=myArray

现在,即使OtherClass保留myArray,如果CurrentClass更改myArray,那么otherclass.otherClassArray也会更改,更正吗?

所以,这是更好的方法吗,或者我错了,上面的内容会做我对以下的期望:

第二种技术

CurrentClass.m

otherclass.otherClassArray=[NSArray arrayWithArray:myArray]

现在有一个不同的副本,所以对myArray的任何更改都不会对otherClassArray产生任何影响,我是对的,还是这两种方法都做同样的事情?

更新:为什么我应该使用或不应该使用上述第二种技术与使用copy属性相比?看起来这两种技术都会导致我的班级拥有一个新的NSArray。

1 个答案:

答案 0 :(得分:1)

这正是it generally推荐that属性的原因,其类具有可变子类(最值得注意的是,NSString和各种集合类)被声明为{{ 1}}:

copy

然后,无论何时设置属性,@property (nonatomic, copy) NSArray * otherClassArray; 都将获得自己的数组版本。

您的第二种技术与声明OtherClass属性具有相同的结果,是的,但是它应该留给该属性的所有者,无论它是否需要副本。换句话说,封装的原则要求客户端代码(copy)不负责知道CurrentClass需要拥有自己的对象版本。这是设计和可维护性的问题。