gpt4 book ai didi

objective-c - 关于objective-c中setter的一个问题

转载 作者:搜寻专家 更新时间:2023-10-30 19:59:22 25 4
gpt4 key购买 nike

这是来自 The Objective-C 2.0 Programming Language 的示例。我只是想知道,在底部的 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

最佳答案

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

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

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

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

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

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

关于objective-c - 关于objective-c中setter的一个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1138329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com