@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。

我现在检查了一下,我的期望是不正确的。 我想我认为这是一个错误。