推荐NSString类型的属性用copy

因为如果你用retain, 你保证不了调用者是给你传的是NSString还是NSMutableString,
如果传的是NSMutableString, 那你的这个NSString属性内容就有可能受调用者的影响,
而NSString的属性,通常都是不希望被调用者改变的。

不只是NSString,其他的不可变类, NSArray, NSDictionary, NSSet等,都是推荐用copy的.

并且对于copy的属性,如果你传的是NSString, NSString 的copy实现就是retain,
如果传的是NSMutableString, 它的copy才是真的按字节拷贝。

所以对于copy属性,不用担心其性能。

故对于不可变类的类型属性,放心的一律用copy属性吧.

以上如果说的还是抽象的话,写个代码看看,比如.
@interface Person
@property (nonatomic, retain) NSString *name;
@end
 
Person *p = [[Person alloc] init];
NSMutableString *name = [[NSMutableString alloc] initWithString:@"hello"];
p.name = name;
 
[name appendString:@" world"];
NSLog(@"%@", p.name);  // 此时p.name已变成hello world, 这不是我们想要的。

如果
@interface Person
@property (nonatomic, copy) NSString *name;
@end
 
Person *p = [[Person alloc] init];
NSMutableString *name = [[NSMutableString alloc] initWithString:@"hello"];
p.name = name;
 
[name appendString:@" world"];
NSLog(@"%@", p.name);  // 此时p.name仍为hello, 这是正确的。

你可能感兴趣的:(NSString)