假设我有一个名为SomeClass的类,它有一个字符串属性名:
@interface SomeClass : NSObject
{
NSString* name;
}
@property (nonatomic, retain) NSString* name;
@end
我知道,名字可以被分配一个NSMutableString在这种情况下,这可能会导致错误的行为。
对于一般的字符串,使用copy属性而不是retain属性总是一个好主意吗?
“复制”的属性是否比“保留”的属性效率低?
对于类型为符合NSCopying协议的不可变值类的属性,你几乎总是应该在@property声明中指定copy。在这种情况下,几乎不需要指定retain。
以下是你想这么做的原因:
NSMutableString *someName = [NSMutableString stringWithString:@"Chris"];
Person *p = [[[Person alloc] init] autorelease];
p.name = someName;
[someName setString:@"Debajit"];
Person.name属性的当前值将根据属性被声明为retain还是copy而有所不同——如果属性被标记为retain,则为@"Debajit",但如果属性被标记为copy,则为@"Chris"。
因为在几乎所有情况下,您都希望防止在背后改变对象的属性,所以应该将表示它们的属性标记为copy。(如果你自己编写setter,而不是使用@synthesize,你应该记得在其中使用copy而不是retain。)