聲明一個NSString屬性使用copy要優(yōu)于使用strong。選擇使用copy的理由是,NSString屬性可能被傳入一個NSString實例,也可能是一個NSMutableString實例。當(dāng)傳入了一個NSMutableString實例時,字符串的值可能會被悄悄修改,從而造成不必要的錯誤。通過下面簡單示例,應(yīng)該能夠幫助你更好的理解:
@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);
}
運行程序后會發(fā)現(xiàn),Person的name是“l(fā)iSi”。如果我們更改為使用copy聲明name屬性,Person的name變?yōu)榱恕皕hangSan”。在使用strong聲明該屬性,字符串的retain計數(shù)將增加1,屬性與字符串指向同一個內(nèi)存地址。這意味著任何指向這個內(nèi)存地址的變量都可改變這個值,該例子中personName變量的值改變后,name屬性值也跟隨變化。如果改用copy的話,則會為Person類創(chuàng)建一個字符串副本,當(dāng)修改personName 的值時,不會影響字符串副本的值。