一个问题是关于定者在目标c
-
16-09-2019 - |
题
这是一个例子的目标-C2.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
解决方案
最快和最安全的做法将是增加 @synthesize value
到顶部的执行情况,并编译器将会自动产生这些方法。
问题的复制与保留取决于事实上,你可以通过在一个NSMutableString,这将改变它的价值。如果你有一个装定为一种'不可改变的类型(string,设置,列、词典),需要使用 copy
语义。首先这可能似乎有悖常理(为什么让一个副本,如果这是不可改变的?) 但事实是,这类想要假设它是不可改变的,什么是通过在实际上可能不是一成不变的。
NSMutable类实现 copy
选择返回的一个不可改变的版本为什么他们表示。这一成不变的类(NSString,等等)实施 copy
与 retain
呼叫。这就是说,他们是非常快。
你器也需要释放 value
然后将其分配给它一个新的价值。正确的代码是:
-(void)setValue:(NSString*)newvalue
{
if (value != newvalue)
{
[value release];
value = [newvalue copy];
}
}
如果你有完全控制所有类可以叫 setValue:
而是绝对肯定你不会通过在NSMutableString,可以使用 retain
, 但它是最好的做法的使用 copy
.
其他提示
它依赖。如果你使用 [newValue retain]
, 另一个目标可以改变的 NSString
指针。通常,您不喜欢有这种行为。
不,你的接口说 copy
.如果有人通过在一个NSMutableString,你将得到非常不同的结果,从这两种方法。
传手法:
-(void)setValue:(NSString*)newvalue{
if (_value != newvalue)
{
[_value release];
_value = nil;
_value = [newvalue copy];
}
}
不隶属于 StackOverflow