NSArray属性:复制还是保留?

How*_*ard 21 copy properties objective-c retain nsarray

根据这个:NSString属性:复制还是保留?

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

NSArray/NSMutableArray怎么样?

Cal*_*leb 26

既然你问的是NSArray(而不是NSMutableArray),你应该使用copy.NSArray是不可变的,因此您不希望该类型的属性发生更改.但是NSMutableArray是NSArray的子​​类,所以对于传递NSMutableArray的人来说它是完全有效的.如果您只是保留该物体,那么它可能会在您的鼻子下方发生变化.如果您复制而不是保留,则该对象不会更改.

但是,您应该知道,当您复制像NSArray这样的容器时,您只复制容器而不复制其内容.如果数组包含可变对象,则即使数组本身是不可变的,这些对象的内容也可能会发生变化.

  • 关于集合对象的警告+1 (4认同)

jus*_*tin 18

选择copy,除非你有一个非常具体的理由,以及所有支持代码/接口来支持它.

我详细介绍了这里的基本原理和几个含义: NSMutableString作为保留/复制

该示例基于NSStrings,但同样适用于NSArrays.


Eik*_*iko 9

如果基础数据发生更改时出现问题,请使用copy.事实上,这是你大多数时候想要的,因为改变某人背后的数据是错误的良好来源.

请注意,副本基本上只是NSArray的保留.只有在抛出NSMutableArray时,才会涉及更多工作.


Wol*_*urs 5

从您包含的链接,它几乎归结为:NSString属性:复制还是保留?

如果要确保在执行期间对象的值不会更改,则使用该copy属性,否则retain将没有问题.一般来说,retain将是确定NSMutableArraysNSArrays(以及许多其他对象),你(通常)更感兴趣的对象,然后在值包含.如果是NSString,你总是对这个值感兴趣,所以你copy要确保它不会改变.

@jlehr:

这取决于开发人员是否对实际价值感兴趣.每当对实际值感兴趣时,使用copy(因为您不希望在执行期间更改值),否则保留就可以了.来自Apple的文档:

Objective-C代码中的常见做法是复制值对象 - 表示属性的对象.C类型变量通常可以替换值对象,但是值对象具有封装方便实用程序以进行常见操作的优点.例如,使用NSString对象而不是字符指针,因为它们封装了编码和存储.

同样来自Apple的文档,关于价值对象的话题:

值对象本质上是一个简单数据元素(如字符串,数字或日期)的面向对象的包装器.Cocoa中的公共值类是NSString,NSDate和NSNumber.值对象通常是您创建的其他自定义对象的属性.