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



我想确保我理解类的属性和实例变量所有权的关键概念,在本例中使用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产生影响,我是对的,还是这两种方法都在做同样的事情?

UPDATE:与将copy与属性一起使用相比,是否有任何理由应该或不应该使用我上面的第二种技术?似乎这两种技术中的任何一种都会产生一个新的NSArray,这是我班拥有的。

这正是为什么通常建议将类具有可变子类(最显著的是NSString和各种集合类)的属性声明为copy:

@property (nonatomic, copy) NSArray * otherClassArray;

然后,无论何时设置该属性,OtherClass都将获得其自己版本的数组。

第二种方法的结果与声明copy属性的结果相同,是的,但应该由属性的所有者决定是否需要副本。换句话说,封装的原则要求客户端代码(CurrentClass)不负责知道OtherClass需要有自己的对象版本。这是一个设计和可维护性的问题。

最新更新