der*_*dji 3 memory setter copy objective-c retain
这是Objective-C 2.0编程语言的一个例子.我只是想知道,在底部的value = [newValue retain]
制定者中,我可以用而不是value = [newValue copy]
吗?
@interface MyClass : NSObject
{
NSString *value;
}
@property(copy, readwrite) NSString *value;
@end
// assume using garbage collection
@implementation MyClass
@dynamic value;
- (NSString *)value {
return value;
}
- (void)setValue:(NSString *)newValue {
if (newValue != value) {
value = [newValue copy];
}
}
@end
Run Code Online (Sandbox Code Playgroud)
最快和最安全的做法是添加@synthesize value
到实现的顶部,编译器将自动生成这些方法.
复制与保留的问题取决于您可能在NSMutableString中传递,这将改变其值.如果你有一个'immutable'类型的setter(string,set,array,dictionary),你需要使用copy
语义.起初这可能看起来违反直觉(为什么要复制它,如果它是不可变的?)但要意识到的是你的类想要假设它是不可变的,传入的内容实际上可能不是不可变的.
NSMutable类copy
通过返回它们所代表的不可变版本来实现选择器.不可变类(NSString等)copy
通过retain
调用实现.也就是说,它们非常快.
您的setter也需要在为其value
分配新值之前释放.正确的代码是:
-(void)setValue:(NSString*)newvalue
{
if (value != newvalue)
{
[value release];
value = [newvalue copy];
}
}
Run Code Online (Sandbox Code Playgroud)
如果您完全控制可能调用的所有类setValue:
并且绝对确定您不会传入NSMutableString,则可以使用retain
,但这是最佳实践copy
.