關(guān)于NSString要用Copy來(lái)修飾這個(gè)問(wèn)題,我不多說(shuō)只是擺出代碼:
Person * xiaoMing = [[Personalloc]init];
NSMutableString * name = [[NSMutableStringalloc]initWithString:@"xiaoming"];
xiaoMing.name = name;
NSLog(@"%@", xiaoMing.name);
[name appendString:@"hah"];
// 此時(shí)名字這個(gè)屬性被修改了
NSLog(@"%@", xiaoMing.name);
如果用Copy來(lái)修飾name這個(gè)屬性那么它不會(huì)隨著外部name的改變而改變,如果使用Strong,當(dāng)name這個(gè)字符串改變的時(shí)候,name這個(gè)屬性也會(huì)隨著改變(沒(méi)有生產(chǎn)一個(gè)新的對(duì)象,只是多了一個(gè)指針指向name)。
xiaoMing.name = name;(此時(shí)name是用copy修飾的) 等同于 xiaoMing.name = [name copy];(copy對(duì)可變對(duì)象進(jìn)行的是深拷貝,此時(shí)是拷貝出了一個(gè)新的對(duì)象然后賦值給了xiaoMing.name。mutableCopy對(duì)所有的對(duì)象進(jìn)行的都是深拷貝)
補(bǔ)充:如果我們希望被賦值的字符串隨著外部字符串的改變而改變,我們也完全可是使用strong來(lái)進(jìn)行修飾。
感覺(jué)上面寫(xiě)的有點(diǎn)啰嗦。
當(dāng)用copy去修飾一個(gè)OC對(duì)象屬性后,系統(tǒng)為我們生成的set方法是這樣的:
- (void)setName:(NSString *)name{
if (_name != name) {
[_name release];
_name = [name copy];
}
}
對(duì)外部傳進(jìn)來(lái)的字符串進(jìn)行了copy操作,當(dāng)外部傳入的是一個(gè)可變字符串的時(shí)候,為了保證拷貝的副本對(duì)象與源對(duì)象互不影響,此時(shí)的copy做的是一次深拷貝,所以用copy修飾字符串的時(shí)候,被修飾的字符串不會(huì)隨著賦值字符串的改變而改變。
總結(jié)!
1.copy是不能用來(lái)修飾可變對(duì)象的,如:NSMutableString、NSMutableArray、NSMutableDictionary。使用copy之后這些實(shí)例對(duì)象就變成了不可變對(duì)象,如果進(jìn)行增、刪、改的操作就會(huì)報(bào)錯(cuò)。
2.strong不適合用來(lái)修飾不可變對(duì)象,如:NSString、NSArray、NSDictionary。使用strong之后這些實(shí)例對(duì)象被賦值之后由于沒(méi)有生成新的對(duì)象,很可能隨著賦值對(duì)象的改變而改變。
@property (nonatomic, strong) NSArray * array;
NSMutableArray * mutableArray = [NSMutableArray arrayWithArray:@[@"1", @"2"]];
self.array = mutableArray;
[mutableArray addObject:@"3"];
代碼中self.array會(huì)永遠(yuǎn)和mutableArray中的數(shù)據(jù)一樣。