这是一个例子的目标-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,等等)实施 copyretain 呼叫。这就是说,他们是非常快。

你器也需要释放 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];

        }
   }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top