假设我有一个名为SomeClass的类,它的属性名为string:

@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.)

Objective-c相关问答推荐

我在哪里可以找到 info.plist 文件?

在 iOS 7 上,如果最终包含在选项卡栏控制器中,则使用工具栏推送控制器会留下不可用空间的间隙

TWTweetComposeViewController 在 IOS6 中已弃用

Objective C中的简单字符串连接

iphone keys 串项目在应用程序卸载后仍然存在?

在objective-c中isa是什么意思?

Objective-C:集合枚举块中的 continue继续?

如何将 NSDictionary 转换为 NSMutableDictionary?

try 标记应用程序图标但未获得用户标记应用程序的权限:iOS 8 Xcode 6

你如何安排一个块在下一次运行循环迭代中运行?

在 Objective-C/cocoa 中创建文件夹/目录

Objective-C - 何时使用touch

使用 Objective-C 查找 IMEI 号码

在Objective-C中替换字符串中的一个字符

如何逐行从 NSFileHandle 读取数据?

Select 具有受支持架构的目标以便在此设备上运行

Objective C 中的对象分配和初始化

获取当前调度队列?

通过情节提要加载时如何初始化视图?

请求访问相机胶卷的权限