copy胰锌、mutableCopy、單層深拷貝

我記得剛開(kāi)始開(kāi)發(fā)的時(shí)候藐窄,有一段時(shí)間我一直以為淺拷貝==copy资昧, mutableCopy==深拷貝, 由于沒(méi)有仔細(xì)研究荆忍,鬧過(guò)一段時(shí)間笑話格带。

深拷貝淺拷貝的概念直接抄錄如下:

淺拷貝:指針拷貝,不產(chǎn)生新的對(duì)象刹枉,源對(duì)象的引用計(jì)數(shù)器+1叽唱;
深拷貝:對(duì)象拷貝,會(huì)產(chǎn)生新的對(duì)象微宝,源對(duì)象的引用計(jì)數(shù)器不變棺亭;

Example 1

 NSArray * array = [NSArray arrayWithObjects:@"abc", @"lucy", nil];

NSMutableArray * array1 = [array copy];
  // 調(diào)用這個(gè)方法會(huì)crash
  //  [array1 addObject:@"Lili"];

NSMutableArray * array2 = [array mutableCopy];
[array2 addObject:@"Lili"];

NSLog(@"array: %@ -%p",[array class],array);
NSLog(@"array1: %@ -%p",[array1 class],array1);
NSLog(@"array2: %@ -%p",[array2 class],array2);

打印結(jié)果:


example-1.png

不可變類型array的copy操作是淺拷貝,生成一個(gè)不可變對(duì)象蟋软;mutableCopy是深拷貝镶摘,生成一個(gè)可變對(duì)象嗽桩。

Example 2

 NSMutableArray * array = [NSMutableArray arrayWithObjects:@"abc", @"lucy", nil];

NSMutableArray * array1 = [array copy];
// 調(diào)用這個(gè)方法會(huì)crash
//  [array1 addObject:@"Lili"];

NSMutableArray * array2 = [array mutableCopy];
[array2 addObject:@"Lili"];

NSLog(@"array: %@ -%p",[array class],array);
NSLog(@"array1: %@ -%p",[array1 class],array1);
NSLog(@"array2: %@ -%p",[array2 class],array2);
/ ** 打印結(jié)果
 array: __NSArrayM -0x600002be7750
 array1: __NSArrayI -0x6000025afe80
 array2: __NSArrayM -0x600002be7a20
*/

可變類型array的copy操作是深拷貝,生成一個(gè)不可變對(duì)象凄敢;mutableCopy是深拷貝碌冶,生成一個(gè)可變對(duì)象。

原對(duì)象類型 拷貝方法 深/淺拷貝 副本對(duì)象類型
NSArray copy 淺拷貝 NSArray
NSArray mutableCopy 深拷貝 NSMutableArray
NSMutableArray copy 深拷貝 NSArray
NSMutableArray mutableCopy 深拷貝 NSMutableArray

Example 3 單層深拷貝和完全深拷貝

 NSMutableString * str1 =  [NSMutableString stringWithString:@"Bian"] ;
NSMutableString * str2 = [NSMutableString stringWithString:@"Sun"] ;
NSMutableArray * mutableArr = [[NSMutableArray alloc] initWithObjects:str1,str2, nil];
NSMutableArray * copyMutableArr = [mutableArr mutableCopy];

NSLog(@"mutableArr:%p %p %p",mutableArr,mutableArr[0],mutableArr[1]);
NSLog(@"copyMutableArr:%p %p %p",copyMutableArr,copyMutableArr[0],copyMutableArr[1]);
 // 修改str1的值
 [str1 insertString:@"abc" atIndex:0];
NSLog(@"mutableArr:%p %p %p",mutableArr,mutableArr[0],mutableArr[1]);
NSLog(@"copyMutableArr:%p %p %p",copyMutableArr,copyMutableArr[0],copyMutableArr[1]);
NSLog(@"%@",copyMutableArr[0]);
/** 打印結(jié)果:
mutableArr:0x600003ddaa90 0x600003ddaa30 0x600003dda9d0
copyMutableArr:0x600003ddaac0 0x600003ddaa30 0x600003dda9d0
mutableArr:0x600003ddaa90 0x600003ddaa30 0x600003dda9d0
copyMutableArr:0x600003ddaac0 0x600003ddaa30 0x600003dda9d0
copyMutableArr的str1的值:abcBian
*/

mutableArr的深拷貝copyMutableArr開(kāi)辟了新的內(nèi)存贡未,但是里面值得內(nèi)存地址還和mutableArr共享一份地址种樱,明顯就是指針拷貝,所以說(shuō)這不是完全意義上的深拷貝俊卤,叫單層深拷貝嫩挤!

那么如何實(shí)現(xiàn)完全深拷貝呢?
如下
//只需這樣創(chuàng)建深拷貝,就是完全深拷貝
 NSMutableArray * copyMutableArr = [[NSMutableArray alloc] initWithArray:mutableArr copyItems:YES];

結(jié)論:

  • 可變對(duì)象的copy和mutableCopy方法都是深拷貝消恍;
  • 不可變對(duì)象的copy方法是淺拷貝岂昭,mutableCopy方法是深拷貝;
  • copy方法返回的對(duì)象都是不可變對(duì)象狠怨。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末约啊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子佣赖,更是在濱河造成了極大的恐慌恰矩,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件憎蛤,死亡現(xiàn)場(chǎng)離奇詭異外傅,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)俩檬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門萎胰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人棚辽,你說(shuō)我怎么就攤上這事技竟。” “怎么了屈藐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵榔组,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我联逻,道長(zhǎng)瓷患,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任遣妥,我火速辦了婚禮擅编,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己爱态,他們只是感情好谭贪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著锦担,像睡著了一般俭识。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上洞渔,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天套媚,我揣著相機(jī)與錄音,去河邊找鬼磁椒。 笑死堤瘤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的浆熔。 我是一名探鬼主播本辐,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼医增!你這毒婦竟也來(lái)了慎皱?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叶骨,失蹤者是張志新(化名)和其女友劉穎茫多,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體忽刽,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡天揖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缔恳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡洁闰,死狀恐怖歉甚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扑眉,我是刑警寧澤纸泄,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站腰素,受9級(jí)特大地震影響聘裁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弓千,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一衡便、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦镣陕、人聲如沸谴餐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)岂嗓。三九已至,卻和暖如春鹊碍,著一層夾襖步出監(jiān)牢的瞬間厌殉,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工侈咕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留公罕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓乎完,卻偏偏與公主長(zhǎng)得像熏兄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子树姨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容