简体   繁体   中英

Does @property copy in combination with readonly make sense?

If I understand this correctly, copy enforces the setter to create a copy of the object passed in. However, if I use it together with readonly , there won't be a setter. So is my assumption correct, that combining @property (copy, readonly) doesn't make any sense or am I missing something?

It does make sense. For instance, if you want to access a property's setter in your implementation only:

@interface MyClass : NSObject
@property (nonatomic, copy, readonly) NSData *data;

- (id)initWithData:(NSData *)data;

@end

and in the class continuation in the .m file:

@interface MyClass ()
@property (nonatomic, copy, readwrite) NSData *data;
@end

Note that the copy, readonly declaration in the public header is required in this case!

According to Apple's documentation (which I've linked here for you):

copy
Specifies that a copy of the object should be used for assignment.

The previous value is sent a release message.

The copy is made by invoking the copy method. This attribute is valid only for object types, which must implement the NSCopying protocol.

So yes, you're correct... readonly creates a getter method and copy would be effectively ignored, since there's no setter method that does assignment.

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

I think, if I saw such a property, on read, I would expect to receive a distinct returned object to the ivar unless the returned object was advertised to be immutable.

If I have

@property (readonly, copy) NSMutableArray* foo;

and I do this:

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

I would expect myOtherFoo not to have the extra string in it that myFoo has.

Note: I haven't verified this yet.

I have checked it now and my expectation is incorrect. I think I would regard that as a bug.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM