既然您询问的是NSArray(而不是NSMutableArray),那么您应该使用copy。NSArray是不可变的,所以您不希望该类型的属性发生更改。但是NSMutableArray是NSArray的子类,因此可以合法地传递NSMutableArray。如果您只保留该对象,那么它可能会在您眼前发生更改。如果您使用copy而不是retain,则该对象将不会更改。
然而,您应该知道当您复制像NSArray这样的容器时,您只复制了容器本身而不是其中的内容。如果数组包含可变对象,那么即使数组本身是不可变的,这些对象的内容也可能会更改。
选择copy
,除非你有非常特殊的理由不这样做,并且需要支持相应的代码/接口。
我在这里详细说明了原因和一些影响: NSMutableString作为retain/copy
该示例基于NSString
,但同样适用于NSArray
。
如果底层数据发生变化会有问题,那么请使用 copy。实际上,大多数情况下这是您想要的,因为在某人背后更改数据是错误的好源头。
请注意,对于NSArray,copy本质上只是一个retain。只有当你使用NSMutableArray时,才需要更多的工作。
copy
以确保它不会更改。
@jlehr:
这取决于开发人员是否真正关心实际值。每当您关心实际值时,请使用copy(因为您不希望在执行期间更改值),否则retain就可以了。来自Apple文档的信息:
另外,来自Apple文档的信息,关于值对象:在Objective-C代码中,复制值对象(表示属性的对象)是一种常见做法。C类型变量通常可以替换为值对象,但值对象具有封装方便的实用程序以进行常见操作的优点。例如,使用NSString对象代替字符指针,因为它们封装了编码和存储。
价值对象本质上是一个面向对象的简单数据元素的包装器,例如字符串,数字或日期。 Cocoa中常见的值类是NSString,NSDate和NSNumber。值对象通常是您创建的其他自定义对象的属性。
NSArray
的属性使用“复制”语义的原因。 - jlehr
@property(copy) NSArray *myArray
的唯一优势就是防止数组大小改变吗?它不能防止淘气的人传入一个 NSMutableArray 并更改其内容。 - Pwner@property(copy)
会防止数组的内容发生变化,也就是说数组将继续引用相同顺序的对象,但它不能防止单个对象本身被更改。 - Caleb