我想确保我理解类的属性和实例变量所有权的关键概念,在本例中使用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
需要有自己的对象版本。这是一个设计和可维护性的问题。