@property复制与readonly有意义吗?

时间:2012-02-22 15:05:20

标签: objective-c ios

如果我理解正确,copy强制设置者创建传入的对象的副本。但是,如果我与readonly一起使用,则不会成为一个二传手。我的假设是正确的,结合@property (copy, readonly)没有任何意义,或者我错过了什么?

4 个答案:

答案 0 :(得分:28)

确实有意义。例如,如果您只想在实现中访问属性的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声明是必需的!

答案 1 :(得分:12)

根据Apple's documentation(我在这里为您链接):

  

copy
  指定应使用对象的副本进行分配。

     

先前的值会发送release消息。

     

通过调用copy方法进行复制。此属性有效   仅适用于必须实现NSCopying协议的对象类型。

所以是的,你是正确的...... readonly创建了一个getter方法,copy将被有效忽略,因为没有setter方法可以进行赋值。

答案 2 :(得分:-1)

你是对的,两者都没有意义。

答案 3 :(得分:-2)

我认为,如果我看到这样的属性,在读取时,我希望收到一个明确的返回对象到ivar,除非返回的对象被宣告为不可变的。

如果我有

@property (readonly, copy) NSMutableArray* foo;

我这样做:

NSMutableArray* myFoo = [theObject foo];
[myFoo addObject: @"string"];
NSMutableArray* myOtherFoo = [theObject foo];

我希望myOtherFoo不要在myFoo中拥有额外的字符串。

注意:我还没有验证过。

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