讓你快速解開對copy瘦锹、mutableCopy,深復制和淺復制的疑惑

雖然這不是一個難點闪盔,但是弯院,可能很多人會在這個地方犯迷糊,現(xiàn)在泪掀,我就用最簡單的方式讓你快速理解這個問題听绳!

首先,先叫明白淺復制和深復制的區(qū)別:淺拷貝只是增加了一個指針指向已經存在的內存异赫,兩個指針指向同一快內存椅挣,就相當于本來一個人有自己的名字A,然后塔拳,又給他取了個名字B鼠证,但是你在叫A、B的時候靠抑,都是同一個人來答復量九;而深拷貝就是增加一個指針并且申請一塊新的內存,使這個增加的指針指向這個新的內存颂碧,就相當于本來一個人有自己的名字A荠列,然后,他有一個孿生兄弟名字叫做B稚伍,所以你叫A弯予、B的時候是不同的人答復。

“copy就是淺拷貝个曙,mutableCopy就是深拷貝”锈嫩,也不知道這句話是誰說出來的受楼,但是,這句話是不對的呼寸,也不是完全不對艳汽,“mutableCopy就是深拷貝”這句話還是可以的,但是对雪,不要這樣考慮這個問題河狐,下面用代碼來幫助理解。

第一步瑟捣,非容器類前后的地址變化(NSString馋艺、NSNumber等):

//不可變對象copy
NSString * smile = @"^_^";
NSString * copySmile = [smile copy];
NSLog(@"smile:%p",smile);
NSLog(@"copySmile:%p",copySmile);

//輸出內容(地址相同):
smile:0x100bb4560
copySmile:0x100bb4560
//不可變對象mutableCopy
NSString * smile = @"^_^";
NSMutableString * copySmile = [smile mutableCopy];
NSLog(@"smile:%p",smile);
NSLog(@"copySmile:%p",copySmile);

//輸出內容(地址不同):
smile:0x100c0c560
copySmile:0x15978ff00
//可變對象copy
NSMutableString * mutableSmile = [NSMutableString stringWithString:@"^_^"];
NSString * copySmile = [mutableSmile copy];
NSLog(@"mutableSmile:%p",mutableSmile);
NSLog(@"copySmile:%p",copySmile);

//輸出內容(地址不同):
mutableSmile:0x16077bd80
copySmile:0xa000000005e5f5e3
//可變對象mutableCopy
NSMutableString * mutableSmile = [NSMutableString stringWithString:@"^_^"];
NSMutableString * copySmile = [mutableSmile mutableCopy];
NSLog(@"mutableSmile:%p",mutableSmile);
NSLog(@"copySmile:%p",copySmile);

//輸出內容(地址不同):
mutableSmile:0x15e00ef30
copySmile:0x15e00ef70

第二步,容器類前后的地址變化(NSArray迈套,NSDictionary等):

//不可變對象copy
NSArray *arraySmile = [NSArray arrayWithObjects:@"^_^",@"O(∩_∩)O",@"(*^__^*)",nil];
NSArray *arraySmileCopy = [arraySmile copy];
NSLog(@"arraySmile:%p",arraySmile);
NSLog(@"arraySmileCopy:%p",arraySmileCopy);
NSLog(@"arraySmile[0]:%p",arraySmile[0]);
NSLog(@"arraySmileCopy[0]:%p",arraySmileCopy[0]);

//輸出內容(地址完全相同捐祠,額...數(shù)組和數(shù)組的相同,元素和元素的相同):
arraySmile:0x14efc4ee0
arraySmileCopy:0x14efc4ee0
arraySmile[0]:0x100b8c560
arraySmileCopy[0]:0x100b8c560
//不可變對象mutableCopy
NSArray *arraySmile = [NSArray arrayWithObjects:@"^_^",@"O(∩_∩)O",@"(*^__^*)",nil];
NSMutableArray *mutableArraySmileCopy = [arraySmile mutableCopy];
NSLog(@"arraySmile:%p",arraySmile);
NSLog(@"mutableArraySmileCopy:%p",mutableArraySmileCopy);
NSLog(@"arraySmile[0]:%p",arraySmile[0]);
NSLog(@"mutableArraySmileCopy[0]:%p",mutableArraySmileCopy[0]);

//輸出內容(數(shù)組和數(shù)組的不同桑李,元素和元素的相同):
arraySmile:0x125e7ea00
mutableArraySmileCopy:0x125e961f0
arraySmile[0]:0x100bc8560
mutableArraySmileCopy[0]:0x100bc8560

PS:如果執(zhí)行:[mutableArraySmileCopy removeObjectAtIndex:0];這句代碼再輸出會怎么樣那踱蛀?
//輸出內容(數(shù)組和數(shù)組的不同,元素和元素的不同):
arraySmile:0x12c7799f0
mutableArraySmileCopy:0x12ddf3230
arraySmile[0]:0x100b74560
mutableArraySmileCopy[0]:0x100b74580
mutableArraySmileCopy:( O(∩_∩)O, (*^__^*) )
arraySmile:(^_^,O(∩_∩)O,(*^__^*) )
這個說明那贵白,mutableArraySmileCopy還可以修改自己的對象率拒。
//可變對象copy
NSMutableArray *arraySmile = [NSMutableArray arrayWithObjects:@"^_^",@"O(∩_∩)O",@"(*^__^*)",nil];
NSArray *arraySmileCopy = [arraySmile copy];
NSLog(@"arraySmile:%p",arraySmile);
NSLog(@"arraySmileCopy:%p",arraySmileCopy);
NSLog(@"arraySmile[0]:%p",arraySmile[0]);
NSLog(@"arraySmileCopy[0]:%p",arraySmileCopy[0]);

//輸出內容(數(shù)組和數(shù)組的不同,元素和元素的相同):
arraySmile:0x13f840fb0
arraySmileCopy:0x13f5ba480
arraySmile[0]:0x100bfc560
arraySmileCopy[0]:0x100bfc560
//可變對象mutableCopy
NSMutableArray *arraySmile = [NSMutableArray arrayWithObjects:@"^_^",@"O(∩_∩)O",@"(*^__^*)",nil];
NSMutableArray *mutableArraySmileCopy = [arraySmile mutableCopy];
NSLog(@"arraySmile:%p",arraySmile);
NSLog(@"mutableArraySmileCopy:%p",mutableArraySmileCopy);
NSLog(@"arraySmile[0]:%p",arraySmile[0]);
NSLog(@"mutableArraySmileCopy[0]:%p",mutableArraySmileCopy[0]);

//輸出內容(數(shù)組和數(shù)組的不同禁荒,元素和元素的相同):
arraySmile:0x145ee7080
mutableArraySmileCopy:0x145f2c0a0
arraySmile[0]:0x100bc8560
mutableArraySmileCopy[0]:0x100bc8560

總結:

1.無論是非容器類對象還是容器類對象都符合以下三點規(guī)則:
  • 對于不可變對象猬膨,copy就是淺復制。mutableCopy 就是深復制
  • 對于可變對象圈浇,copy和mutableCopy都是深復制寥掐。
  • 不論是可變還是不可變對象,copy返回的對象都是不可變的磷蜀,mutableCopy返回的對象都是可變的召耘。
2.對于容器類對象
  • 不論是可變的還是不可變的,copy褐隆,mutableCopy返回的容器類對象里所包含的對象的地址和之前都是一樣的污它,即容器內對象都是淺復制。

說的這里庶弃,我想你應該也理解了衫贬。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市歇攻,隨后出現(xiàn)的幾起案子固惯,更是在濱河造成了極大的恐慌,老刑警劉巖缴守,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件葬毫,死亡現(xiàn)場離奇詭異镇辉,居然都是意外死亡,警方通過查閱死者的電腦和手機贴捡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門忽肛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人烂斋,你說我怎么就攤上這事屹逛。” “怎么了汛骂?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵罕模,是天一觀的道長。 經常有香客問我帘瞭,道長手销,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任图张,我火速辦了婚禮,結果婚禮上诈悍,老公的妹妹穿的比我還像新娘祸轮。我一直安慰自己,他們只是感情好侥钳,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布适袜。 她就那樣靜靜地躺著,像睡著了一般舷夺。 火紅的嫁衣襯著肌膚如雪苦酱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天给猾,我揣著相機與錄音疫萤,去河邊找鬼。 笑死敢伸,一個胖子當著我的面吹牛扯饶,可吹牛的內容都是我干的。 我是一名探鬼主播池颈,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼尾序,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了躯砰?” 一聲冷哼從身側響起每币,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎琢歇,沒想到半個月后兰怠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梦鉴,經...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年痕慢,在試婚紗的時候發(fā)現(xiàn)自己被綠了尚揣。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡掖举,死狀恐怖凶伙,靈堂內的尸體忽然破棺而出蘑辑,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布驶臊,位于F島的核電站,受9級特大地震影響侍郭,放射性物質發(fā)生泄漏棚壁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一继榆、第九天 我趴在偏房一處隱蔽的房頂上張望巾表。 院中可真熱鬧,春花似錦略吨、人聲如沸集币。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鞠苟。三九已至,卻和暖如春秽之,著一層夾襖步出監(jiān)牢的瞬間当娱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工考榨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留跨细,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓河质,卻偏偏與公主長得像扼鞋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子愤诱,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內容