I wonder if there is a rule of thumb you follow, when deciding whether or not a given property in ObjectiveC should be a retain
or copy
?
How do you decide which it should be?
Typically you use copy
for safety with classes which have mutable variants, like NSString
, NSArray
, the other collection classes, etc. To see why, consider what happens here...
Once upon a time,
@interface MyClass : NSObject
@property (retain) NSString *happyString;
- (void)rejoice;
@end
Then one day,
- (void)bigBadMethod {
MyClass *myObject = [[[MyClass alloc] init] autorelease];
NSMutableString *theString = [NSMutableString stringWithString:@"I'm happy!"];
myObject.happyString = theString; // this is allowed because NSMutableString inherits from NSString
[myObject rejoice]; // prints "I'm happy!"
when suddenly...
[theString setString:@"BRAAAAIIINNNSSSSS"];
[myObject rejoice]; // prints "BRAAAAIIINNNSSSSS"
}
And you wouldn't want that, would you? So use @property (copy)
if you don't want to get mutated while you're not looking!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With