Обычно вы используете copy
для безопасности с классами, которые имеют изменяемые варианты, например NSString
, NSArray
, другие классы коллекций и т. Д. Чтобы понять почему, рассмотрите, что здесь происходит ...
Давным-давно
@interface MyClass : NSObject
@property (retain) NSString *happyString;
- (void)rejoice;
@end
Тогда однажды,
- (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!"
когда вдруг ...
[theString setString:@"BRAAAAIIINNNSSSSS"];
[myObject rejoice]; // prints "BRAAAAIIINNNSSSSS"
}
И тебе бы этого не хотелось, не так ли? Поэтому используйте @property (copy)
, если вы не хотите, чтобы вас мутировали, пока вы не искали!