这是Objective-C 2.0编程语言的一个例子.
我只是想知道,在底部的setter中,我可以使用value = [newValue retain]
而不是value = [newValue copy]?
我只是想知道,在底部的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的最佳实践.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。