小编典典

NSString 属性:复制还是保留?

all

假设我有一个使用属性名称调用的SomeClassstring

@interface SomeClass : NSObject
{
    NSString* name;
}

@property (nonatomic, retain) NSString* name;

@end

我知道名称可能会被分配,NSMutableString在这种情况下,这可能会导致错误的行为。

  • 对于一般的字符串,使用属性而不是 总是 一个好主意吗?copy``retain
  • “复制”的财产是否比这种“保留”的财产效率低?

阅读 100

收藏
2022-04-07

共1个答案

小编典典

对于类型是符合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

由于几乎在所有情况下,您都希望 防止 在其背后改变对象的属性,因此您应该标记代表它们的属性copy。(如果您自己编写 setter
而不是使用@synthesize,则应该记住实际使用copy而不是retain在其中使用。)

2022-04-07