聊一聊NSString的strong copy mutableCopy。
簡(jiǎn)單概括一下深拷貝和淺拷貝。
淺拷貝:
指針拷貝,復(fù)制一個(gè)新的指針,只想同一塊內(nèi)存區(qū)域。實(shí)際內(nèi)存并沒(méi)有發(fā)生拷貝
深拷貝:
內(nèi)容拷貝,拷貝數(shù)據(jù)到一塊新內(nèi)存區(qū)域,指針指向拷貝的數(shù)據(jù)區(qū)
先定義兩個(gè)NSString屬性
@property (nonatomic, strong) NSString *strongString;
@property (nonatomic, copy) NSString *copyedString;
一個(gè)用strong,一個(gè)用copy。
不可變字符串賦值
NSString *string = @"hui";
self.strongString = string;
self.copyedString = string;
NSLog(@"%p, %p, %p", string, self.strongString, self.copyedString);
打印地址的結(jié)果:
0x10e93b078, 0x10e93b078, 0x10e93b078
可見(jiàn),不管是strong還是copy屬性的對(duì)象,將不可變的字符串賦值給它們,它們都執(zhí)行的是淺拷貝。
所以它們都指向了同一個(gè)地址。
可變字符串賦值
NSMutableString *mutableString = [NSMutableString stringWithString:@"hui"];
self.strongString = mutableString;
self.copyedString = mutableString;
NSLog(@"%p, %p, %p", mutableString, self.strongString, self.copyedString);
打印地址的結(jié)果:
0x600003866700, 0x600003866700, 0x89853a7b95263aa8
從打印結(jié)果中可以發(fā)現(xiàn),strong修飾的字符串(strongString)與mutableString指向了同一個(gè)地址,但是copy修飾的字符串(copyedString)指向了另外一個(gè)地址。因?yàn)閳?zhí)行了深拷貝。
不可變字符串調(diào)用mutableCopy
NSString *string = @"hui";
[[string mutableCopy] appendFormat:@"_li"];
// [[string copy] appendString:@"_li"]; 這句話執(zhí)行會(huì)報(bào)錯(cuò),因?yàn)閏opy后,拷貝出來(lái)的是一個(gè)不可變字符串
NSLog(@"%p, %p", string, [string mutableCopy]);
打印結(jié)果:
0x10ee70078, 0x6000037cec40
通過(guò)打印結(jié)果,可以得到,不可變字符串調(diào)用mutableCopy執(zhí)行了深拷貝,拷貝出來(lái)的是一個(gè)可變的字符串。
可變字符串調(diào)用mutableCopy
NSMutableString *mutableString = [NSMutableString stringWithString:@"hui"];
[[mutableString mutableCopy] appendFormat:@"_li"];
// [[mutableString copy] appendString:@"_li"]; //這句話執(zhí)行會(huì)報(bào)錯(cuò),因?yàn)閏opy后,拷貝出來(lái)的是一個(gè)不可變字符串
NSLog(@"%p, %p", mutableString, [mutableString mutableCopy]);
打印結(jié)果:
0x6000000916b0, 0x6000000c4b40
通過(guò)打印結(jié)果,可以得到,可變字符串調(diào)用mutableCopy執(zhí)行了深拷貝,拷貝出來(lái)的是一個(gè)可變的字符串。
總結(jié):
1. strong出來(lái)的字符串,執(zhí)行的是淺拷貝;
2. copy出來(lái)的字符串一定是不可變的字符串。傳入的字符串如果不可變,那么執(zhí)行的就是淺拷貝;如果是可變,那么執(zhí)行的就是深拷貝;
3. mutableCopy出來(lái)的字符串一定是可變的字符串,無(wú)論傳入的字符串可變與否,都是執(zhí)行深拷貝;
over!