Iphone 何时使用“保留”和何时使用“复制”

Iphone 何时使用“保留”和何时使用“复制”,iphone,objective-c,Iphone,Objective C,我不知道该用哪个,什么时候用。有经验法则吗?在大多数情况下,它们中的任何一个都可以使用吗?有什么特别规定吗 @property (nonatomic, retain) NSDate *theDateFromPicker; @property (nonatomic, copy) NSDate *theDateFromPicker; 在这种情况下,哪一个是最佳选择 谢谢 -编码使用副本,您将拥有两个不同的对象。 因此,如果修改其中一个对象,则不会修改另一个对象。如果不希望对象被另一个对象修改,则需

我不知道该用哪个,什么时候用。有经验法则吗?在大多数情况下,它们中的任何一个都可以使用吗?有什么特别规定吗

@property (nonatomic, retain) NSDate *theDateFromPicker;
@property (nonatomic, copy) NSDate *theDateFromPicker;
在这种情况下,哪一个是最佳选择

谢谢
-编码

使用副本,您将拥有两个不同的对象。
因此,如果修改其中一个对象,则不会修改另一个对象。

如果不希望对象被另一个对象修改,则需要使用“复制”

一个很好的例子是
NSString
。假设您有以下代码:

@property (nonatomic, retain) NSString *aString;

// in some other class

NSMutableString *mutableString = [[NSMutableString alloc] initWithString:@"test"];
theObject.aString = mutableString; // theObject retains the mutable string

[mutableString setString:@"test2"];

这里发生的事情是,您将值“test”赋给aString,但随后它在外部被修改,变成“test2”,因为您保留了可变字符串。如果设置了
copy
,则不会发生这种情况,因为您正在复制可变字符串。

copy为您提供一个单独的对象

一般来说,您应该只使用retain,除非您明确地想要创建对象的副本。每次复制都必须发布,所以请记住这一点

使用-copy的最佳时机是使用枚举添加或删除对象

以数组为例。如果要枚举数组,则在枚举过程中无法向其中添加或删除对象,否则将崩溃。在开始枚举之前,请使用-copy创建数组的新副本,并且在枚举时,如果需要添加/删除对象(mutate),可以在副本上执行此操作


完成枚举后,可以将副本设置回原始副本。

NSDate是不可变的,目前我们没有可变的子类。所以保留是好的。复制也不会有什么坏处,事实上,我希望复制只在这里返回相同的实例(再次保留)


使用copy at NSString的原因是,您可能会将一个NSMutableString传递给您的对象,而该对象可能会在您的脚下发生变化。这在这里不会发生。

在iOS中,您通常使用单线程,因此对象不可能同时被修改。 此外,即使指定了
copy
,也可以通过再次设置来修改该属性

经验法则是:“在iOS上使用
retain

但是,很少有情况需要/建议使用副本:

  • 如果您接受块(与iOS4一起添加的代码块),则必须使用copy,因为这些块需要在保留之前复制到堆中(有关更多详细信息,请参阅
  • 如果您编写的代码将在后台执行,那么使用(原子、复制)会更安全
  • <> LI>如果您想确保仅分配给属性更改它的值,则应该考虑使用拷贝。(如果实现KVO)可能有用。
经验法则是,如果类实现了
NSCopying
协议,则使用
copy
,除非您有充分的理由不这样做。我能想到的唯一好的理由是性能。例如,从技术上讲,对于
NSMutableArray
属性,您应该使用
copy
,但正如您可以想象的那样,复制大型可变数组阵列将在CPU时间和内存方面变得昂贵