3

这是来自 The Objective-C 2.0 Programming Language 的示例。我只是想知道,在底部的设置器中,我可以使用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
4

4 回答 4

7

最快和最安全的做法是添加@synthesize value到您的实现的顶部,编译器将自动生成这些方法。

复制与保留的问题取决于您可能会传入一个 NSMutableString,这会改变它的值。如果您有一个“不可变”类型(字符串、集合、数组、字典)的设置器,则需要使用copy语义。起初这可能看起来违反直觉(如果它是不可变的,为什么还要制作副本?)但要意识到你的类想要假设它是不可变的,而传入的内容实际上可能不是不可变的。

NSMutable 类copy通过返回它们所代表的不可变版本来实现选择器。不可变类(NSString 等)copy通过retain调用实现。也就是说,它们非常快。

您的 setter 还需要在为其value分配新值之前释放。正确的代码是:

-(void)setValue:(NSString*)newvalue
{
    if (value != newvalue)
    {
        [value release];
        value = [newvalue copy];
    }
}

如果您可以完全控制所有可能调用的类,setValue:并且绝对确定不会传入 NSMutableString,则可以使用retain,但最好使用copy.

于 2009-07-16T15:19:14.190 回答
0

不,您的界面显示copy. 如果有人传入一个 NSMutableString,你会从这两种方法中得到非常不同的结果。

于 2009-07-16T15:17:26.130 回答
0

这取决于。如果你使用[newValue retain],另一个对象可能会改变这个NSString指针的值。通常,您不喜欢这种行为。

于 2009-07-16T15:18:21.477 回答
0

设置方法:

  -(void)setValue:(NSString*)newvalue{
        if (_value != newvalue)
        {
            [_value release];
            _value = nil;
            _value = [newvalue copy];

        }
   }
于 2014-03-22T05:51:56.633 回答