根据这个:NSString property: copy or retain?
对于NSString / NSMutableString,建议使用copy。
NSArray / NSMutableArray怎么样?
答案 0 :(得分:25)
由于您询问NSArray(而不是NSMutableArray),您应该使用copy。 NSArray是不可变的,因此您不希望该类型的属性发生更改。但是NSMutableArray是NSArray的子类,所以对于传递NSMutableArray的人来说它是完全有效的。如果您只是保留该物体,那么它可能会在您的鼻子下方发生变化。如果您复制而不是保留,则该对象不会更改。
但是 ,您应该知道当您复制像NSArray这样的容器时,您只复制容器而不是其内容。如果数组包含可变对象,那么即使数组本身是不可变的,这些对象的内容也可能会发生变化。
答案 1 :(得分:18)
选择copy
,除非你有一个非常具体的理由,以及所有支持代码/接口来支持它。
我详细介绍了这里的基本原理和几个含义: NSMutableString as retain/copy
该示例基于NSString
,但同样适用于NSArray
。
答案 2 :(得分:9)
如果基础数据发生变化时出现问题,请使用 copy 。事实上,这是你大多数时候想要的,因为改变某人背后的数据是错误的良好来源。
请注意,副本基本上只是NSArray的保留。只有在抛出NSMutableArray时,才会涉及更多工作。
答案 3 :(得分:5)
从你所包含的链接中,它几乎归结为:NSString property: copy or retain?
如果你想确保在执行期间对象的值不会改变,你可以使用copy
属性,否则retain
就可以了。通常,retain
对于 NSMutableArrays 和 NSArrays (以及许多其他对象)都可以,因为您(通常)对该对象更感兴趣它包含的价值。如果是 NSString ,您始终对该值感兴趣,因此您copy
确保它不会更改。
<强> @jlehr:强>
这取决于开发人员是否对实际价值感兴趣。无论何时对实际值感兴趣,都使用 copy (因为您不希望在执行期间更改值),否则保留就可以了。来自Apple的文档:
Objective-C代码中的常见做法是复制值对象 - 表示属性的对象。 C类型变量通常可以替换值对象,但是值对象具有封装方便实用程序以进行常见操作的优点。例如,使用NSString对象而不是字符指针,因为它们封装了编码和存储。
同样来自Apple的文档,关于价值对象的主题:
值对象本质上是一个简单数据元素(如字符串,数字或日期)的面向对象的包装器。 Cocoa中的公共值类是NSString,NSDate和NSNumber。值对象通常是您创建的其他自定义对象的属性。