objective-c - NSString 属性 : copy or retain?

标签 objective-c cocoa cocoa-touch

假设我有一个名为 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/

相关文章:

objective-c - 如果组合框动态添加了新的表格行,那么当 NSComboBox 选择发生更改时,我如何收到通知?

cocoa - 将scrollViewDidScroll与多个UIScrollView一起使用

iphone - iPhone 中的 MapView 注释/图钉

objective-c - 在 Objective-C 中,为什么对象的实例变量或属性不能有默认值?

objective-c - 如何在 mac osx 中为文件类型设置自定义图标

ios - Xcode tableview 图像一次又一次加载

ios - UITableViewCell accessoryView 不显示

iphone - 在我的 UITableView 上定位横幅时出现问题

python - pyobjc 应用程序加载时间改进

macos - 应对 Mavericks 的内存压力?