加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

关于目标c中的setter的问题

发布时间:2020-12-16 09:24:19 所属栏目:百科 来源:网络整理
导读:这是Objective-C 2.0编程语言的一个例子. 我只是想知道,在底部的setter中,我可以使用value = [newValue retain] 而不是value = [newValue copy]? @interface MyClass : NSObject{ NSString *value;}@property(copy,readwrite) NSString *value;@end// assum
这是Objective-C 2.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

解决方法

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

复制与保留的问题取决于您可能在NSMutableString中传递,这将改变其值.如果你有一个’immutable’类型的setter(string,set,array,dictionary),你需要使用copy语义.起初这可能看起来违反直觉(为什么要复制它,如果它是不可变的?)但要意识到的是你的类想要假设它是不可变的,传入的内容实际上可能不是不可变的.

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读