NSArray属性:复制还是保留?

时间:2011-05-01 17:07:51

标签: objective-c properties copy nsarray retain

根据这个:NSString property: copy or retain?

对于NSString / NSMutableString,建议使用copy。

NSArray / NSMutableArray怎么样?

4 个答案:

答案 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。值对象通常是您创建的其他自定义对象的属性。