如果我理解正确,copy
强制设置者创建传入的对象的副本。但是,如果我与readonly
一起使用,则不会成为一个二传手。我的假设是正确的,结合@property (copy, readonly)
没有任何意义,或者我错过了什么?
答案 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
中拥有额外的字符串。
注意:我还没有验证过。
我现在检查了一下,我的期望是不正确的。我想我认为这是一个错误。