声明一个NSString属性使用copy要优于使用strong。选择使用copy的理由是,NSString属性可能被传入一个NSString实例,也可能是一个NSMutableString实例。当传入了一个NSMutableString实例时,字符串的值可能会被悄悄修改,从而造成不必要的错误。通过下面简单示例,应该能够帮助你更好的理解:
@interface Person : NSObject
@property (strong, nonatomic) NSString *name;
@end
在另一个类中,对 Person 的name 属性进行赋值
-(void)changeName {
NSMutableString *personName = [NSMutableString stringWithString:@"zhangSan"];
Person *person = [[Person alloc] init];
person.name = personName;
[personName setString:@"liSi"];
NSLog(@"************ %@", person.name);
}
运行程序后会发现,Person的name是“liSi”。如果我们更改为使用copy声明name属性,Person的name变为了“zhangSan”。在使用strong声明该属性,字符串的retain计数将增加1,属性与字符串指向同一个内存地址。这意味着任何指向这个内存地址的变量都可改变这个值,该例子中personName变量的值改变后,name属性值也跟随变化。如果改用copy的话,则会为Person类创建一个字符串副本,当修改personName 的值时,不会影响字符串副本的值。