假设我有一个名为 SomeClass
的类,其属性名称为 string
:
@interface SomeClass : NSObject
{
NSString* name;
}
@property (nonatomic, retain) NSString* name;
@end
我了解可能会为名称分配 NSMutableString
,在这种情况下,这可能会导致错误行为。
- 对于一般的字符串,总是使用
copy
属性而不是retain
是个好主意吗? - “复制”属性的效率是否比“保留”属性低?
最佳答案
对于类型是符合 NSCopying
协议(protocol)的不可变值类的属性,您几乎总是应该在 @property
中指定 copy
声明。在这种情况下,您几乎不需要指定 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
.
因为在几乎所有情况下,您都希望防止改变对象的属性,因此您应该标记代表它们的属性copy
。 (如果你自己编写 setter 而不是使用 @synthesize
你应该记住实际使用 copy
而不是 retain
。)
关于objective-c - NSString 属性 : copy or retain?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/387959/