关于objective-c中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

这是Objective-C2.0编程语言中的一个示例。 我只是想知道,在底部的setter中,我可以使用
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。