@property复制与readonly有意义吗?
如果我理解正确的话, copy
强制setter创建传入的对象的副本。但是,如果我和readonly
一起使用它,就不会有setter。 那么我的假设是正确的,结合@property (copy, readonly)
没有任何意义,或者我错过了什么?
它确实有意义。 例如,如果您只想在实现中访问属性的setter:
@interface MyClass : NSObject @property (nonatomic, copy, readonly) NSData *data; - (id)initWithData:(NSData *)data; @end
并在.m
文件的类继续中:
@interface MyClass () @property (nonatomic, copy, readwrite) NSData *data; @end
请注意,在这种情况下,公共标题中的copy, readonly
声明是必需的!
根据Apple的文档 (我在这里链接到你):
copy
指定应使用对象的副本进行分配。先前的值将发送一条
release
消息。通过调用
copy
方法进行copy
。 此属性仅对对象类型有效,对象类型必须实现NSCopying
协议。
所以,是的,你是正确的…… readonly
创建了一个getter方法, copy
将被有效忽略,因为没有setter方法可以进行赋值。
你是对的,两者都没有意义。
我想,如果我看到这样的属性,在读取时,我希望收到一个明确的返回对象到ivar,除非返回的对象被宣告为不可变的。
如果我有
@property (readonly, copy) NSMutableArray* foo;
我这样做:
NSMutableArray* myFoo = [theObject foo]; [myFoo addObject: @"string"]; NSMutableArray* myOtherFoo = [theObject foo];
我希望myOtherFoo
不要在myFoo
拥有额外的字符串。
注意:我还没有validation。
我现在检查了一下,我的期望是不正确的。 我想我认为这是一个错误。