何时使用retain和何时使用copy

15 iphone objective-c

我很困惑使用哪个以及何时使用.有经验法则吗?大多数情况下可以使用它们吗?任何特殊规则?

@property (nonatomic, retain) NSDate *theDateFromPicker;
@property (nonatomic, copy) NSDate *theDateFromPicker;
Run Code Online (Sandbox Code Playgroud)

在这种情况下哪个是最好的选择?

谢谢-Code

Rit*_*its 14

当您不希望对象被另一个对象修改时,您将需要使用副本.

一个很好的例子是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"];
Run Code Online (Sandbox Code Playgroud)

这里发生的是你将值"test"分配给aString,但随后它被外部修改并变为"test2",因为你保留了可变字符串.如果你已经设置copy,这不会发生,因为你正在制作一个可变字符串的副本.


Eik*_*iko 9

NSDate是不可变的,我们目前没有可变子类.所以保留很好.复制也不会受到伤害,事实上我希望复制只是在这里交回相同的实例(再次保留).

在NSString上使用副本的原因是你可能会将一个NSMutableString传递给你的对象,而这可能会在你脚下发生变化.这不可能发生在这里.