假设我有一个使用属性名称调用的SomeClass类string:
SomeClass
string
@interface SomeClass : NSObject { NSString* name; } @property (nonatomic, retain) NSString* name; @end
我知道名称可能会被分配,NSMutableString在这种情况下,这可能会导致错误的行为。
NSMutableString
copy``retain
对于类型是符合NSCopying协议的不可变值类的属性,您几乎总是应该copy在@property声明中指定。retain在这种情况下,您几乎不需要指定。
NSCopying
copy
@property
retain
这就是您要这样做的原因:
NSMutableString *someName = [NSMutableString stringWithString:@"Chris"]; Person *p = [[[Person alloc] init] autorelease]; p.name = someName; [someName setString:@"Debajit"];
财产的当前价值Person.name将根据财产是否被声明或是否标记财产而有所不同,retain但如果财产被标记。copy``@"Debajit"``retain``@"Chris"``copy
Person.name
copy``@"Debajit"``retain``@"Chris"``copy
由于几乎在所有情况下,您都希望 防止 在其背后改变对象的属性,因此您应该标记代表它们的属性copy。(如果您自己编写 setter 而不是使用@synthesize,则应该记住实际使用copy而不是retain在其中使用。)
@synthesize