关于objective-c中setter的一个问题
这是Objective-C2.0编程语言中的一个示例。 我只是想知道,在底部的setter中,我可以使用关于objective-c中setter的一个问题,objective-c,memory,copy,setter,retain,Objective C,Memory,Copy,Setter,Retain,这是Objective-C2.0编程语言中的一个示例。 我只是想知道,在底部的setter中,我可以使用value=[newValue retain] 而不是value=[newValue copy] @interface MyClass : NSObject { NSString *value; } @property(copy, readwrite) NSString *value; @end // assume using garbage collectio
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
不,您的界面显示“复制”。如果有人传入NSMutableString,您将从这两种方法中获得非常不同的结果。这取决于具体情况。如果使用
[newValue retain]
,则另一个对象可能会更改此NSString
指针的值。通常情况下,您不喜欢这种行为。最快、最安全的方法是将@synthesis value
添加到实现的顶部,编译器将自动生成这些方法
复制与保留的问题取决于这样一个事实:您可能会被传递到一个NSMutableString中,这会改变它的值。如果您有“不可变”类型(字符串、集合、数组、字典)的setter,则需要使用copy
语义。一开始,这似乎有悖常理(如果它是不可变的,为什么要创建一个副本?),但要认识到的是,您的类希望假定它是不可变的,而传入的内容实际上可能不是不可变的
NSMutable类通过返回它们所表示内容的不可变版本来实现copy
选择器。不可变类(NSString等)通过调用retain
实现copy
。也就是说,它们非常快
您的setter还需要先释放值
,然后再为其分配新值。正确的代码是:
-(void)setValue:(NSString*)newvalue
{
if (value != newvalue)
{
[value release];
value = [newvalue copy];
}
}
如果您可以完全控制所有可能调用setValue:
的类,并且绝对确定不会传入NSMutableString,则可以使用retain
,但最好使用copy
setter方法:
-(void)setValue:(NSString*)newvalue{
if (_value != newvalue)
{
[_value release];
_value = nil;
_value = [newvalue copy];
}
}
通过API,Church表示您对
值的声明。两者都应该是copy
或retain
。因此,通过使用copy,我可以跳过类型检查以避免运行时错误,是这样吗?始终使用copy是一个好主意吗?另外,我可以说@property(retain,copy,readwrite)NSString*值吗?效果如何?谢谢你,这不会编译的。当您希望/希望该项不受类可见性的影响时,最好使用copy。如果您有一个不代表值的属性(例如UI outlet属性),请使用retain。