Objective-C中的深拷貝和淺拷貝

在Objective-C中對(duì)象之間的拷貝分為淺拷貝和深拷貝拿撩。說白了崭别,對(duì)非容器類的淺拷貝就是拷貝對(duì)象的地址捎迫,對(duì)象里面存的內(nèi)容仍然是一份,沒有新的內(nèi)存被分配澳叉。對(duì)非容器類的深拷貝就是重寫分配一塊內(nèi)存,然后把另一個(gè)對(duì)象的內(nèi)容原封不動(dòng)的給我拿過來沐悦。對(duì)容器類的深拷貝是對(duì)容器中的每個(gè)元素都進(jìn)行拷貝成洗,容器類的淺拷貝是對(duì)容器里的內(nèi)容不進(jìn)行拷貝,兩個(gè)容器的地址是不同的藏否,但容器里的所裝的東西是一樣的瓶殃,在一個(gè)容器中修改值,則另一個(gè)淺拷貝的容器中的值也會(huì)變化副签。所以對(duì)非容器類看對(duì)象是否為深拷貝還是淺拷貝就得看對(duì)象的內(nèi)存地址就可以看出來遥椿,而對(duì)容器類基矮,我們則進(jìn)一步看容器中的內(nèi)容了。因?yàn)镺C中用引用計(jì)數(shù)的方式來進(jìn)行內(nèi)存管理的所以我們也可以通過觀察對(duì)象retainCount的變化來分析對(duì)象之間是否是深拷貝還是淺拷貝冠场。
那么對(duì)象大體都分為哪些類型呢家浇?從可變不可變和容器類非容器類的角度可以把對(duì)象分為一下幾種,那么什么是容器類呢?容器類就是用該類聲明的對(duì)象可以去容納其他對(duì)象碴裙,非容器類則沒有這些功能钢悲。那么什么是可變或者不可變的呢?可變的時(shí)內(nèi)存的大小是可以根據(jù)需要改變舔株,而不可變的就是分配完以后就不可以改變他的內(nèi)存空間

  1. 非容器不可變對(duì)象莺琳,比如NSString

2.非容器可變對(duì)象:比如NSMutableString

3.容器類不可變對(duì)象: 比如NSArray

4.容器類可變對(duì)象: 比如NSMutableArray

 在觀察深淺拷貝之前先得了解一下retain,copy和mutableCopy的特點(diǎn)载慈,特點(diǎn)如下:

1.retain:始終是淺復(fù)制惭等。引用計(jì)數(shù)每次加一。返回對(duì)象是否可變與被復(fù)制的對(duì)象保持一致办铡。
2.copy:對(duì)于可變對(duì)象為深復(fù)制辞做,引用計(jì)數(shù)不改變;對(duì)于不可變對(duì)象是淺復(fù)制, 引用計(jì)數(shù)每次加一料扰。始終返回一個(gè)不可變對(duì)象凭豪。 
3.mutableCopy:始終是深復(fù)制,引用計(jì)數(shù)不改變晒杈。始終返回一個(gè)可變對(duì)象嫂伞。

深拷貝和淺拷貝


20170207161321864.jpeg
從圖我們看出來淺拷貝只是拷貝了指針,而并未拷貝對(duì)象本身拯钻。而深拷貝則是指針和對(duì)象本身都進(jìn)行了拷貝

代碼演示
使用不可變集合對(duì)象

 NSArray *array = @[@"4444"];
 NSArray *array2 = array;

 NSLog(@"array ===  %p   %p", &array, array);
 NSLog(@"array2 ===  %p   %p", &array2, array2);

打印結(jié)果

array ===  0x7fff5fbff738   0x100403120
array2 ===  0x7fff5fbff730   0x100403120

array與array2指針地址不同

mutableCopy

NSArray *array = @[@"4444"]; 
NSArray *array2 = [array mutableCopy];

NSLog(@"array ===  %p   %p", &array, array);
NSLog(@"array2 ===  %p   %p", &array2, array2);

打印結(jié)果

array ===  0x7fff5fbff738   0x100203520
array2 ===  0x7fff5fbff730   0x1002024e0

我們發(fā)現(xiàn)兩者的指針指著不一樣帖努,內(nèi)容也不一樣,也就是說粪般,實(shí)現(xiàn)了內(nèi)容和指針的拷貝拼余。也就是深拷貝

用copy時(shí)候的打印結(jié)果是什么?
打印結(jié)果

array ===  0x7fff5fbff738   0x100202b90
array2 ===  0x7fff5fbff730   0x100202b90

結(jié)果是內(nèi)容沒有拷貝亩歹,而指針進(jìn)行了拷貝匙监。故copy為淺拷貝

使用可變對(duì)象

NSMutableArray  *mutableArray = [NSMutableArray arrayWithObjects:@"111", @"222",  nil];
NSMutableArray *array1 = [mutableArray copy];
NSLog(@"mutable ===== %p    %p", &mutableArray, mutableArray);
NSLog(@"array1 ===== %p    %p", &array1, array1);

mutable ===== 0x7fff5fbff758    0x100203cb0
array1 ===== 0x7fff5fbff750    0x100203170

指針進(jìn)行了拷貝,內(nèi)容也進(jìn)行了拷貝小作。所以是深拷貝亭姥。
NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"1111",@"22222", nil];
NSMutableArray *array = [mutableArray mutableCopy];
NSLog(@"mutable ===== %p    %p", &mutableArray, mutableArray);
NSLog(@"array1 ===== %p    %p", &array, array);

打印結(jié)果

mutable ===== 0x7fff5fbff758    0x100401270
array1 ===== 0x7fff5fbff750    0x100403230

其指針和內(nèi)容都已經(jīng)進(jìn)行了改變。所以這個(gè)時(shí)候mutableCopy便是深拷貝了顾稀。

對(duì)于使用可變對(duì)象時(shí)达罗,copy和mutableCopy都是深拷貝。

那深拷貝和淺拷貝在使用上的區(qū)別呢静秆?

NSArray *mutableArray = @[@"111"];
NSMutableArray *array = [mutableArray copy];[array addObject:@"333"];
NSLog(@"%@", array);

打印結(jié)果

-[__NSSingleObjectArrayI addObject:] 

說明array是不可變數(shù)組

那如何改變array呢粮揉?

NSArray *mutableArray = @[@"111"];
NSMutableArray *array = [mutableArray mutableCopy];
[array addObject:@"333"];
NSLog(@"%@", array);

我們發(fā)現(xiàn)此時(shí)array是可以更改的對(duì)象

最終結(jié)論

對(duì)于不可變對(duì)象而言巡李,copy便是淺拷貝,而mutableCopy是深拷貝扶认。 
對(duì)于可變對(duì)象而言侨拦,copy和mutableCopy都是深拷貝。但是copy出來的對(duì)象是不可變的蝠引,而mutableCopy則是可變對(duì)象阳谍。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市螃概,隨后出現(xiàn)的幾起案子矫夯,更是在濱河造成了極大的恐慌,老刑警劉巖吊洼,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件训貌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡冒窍,警方通過查閱死者的電腦和手機(jī)递沪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來综液,“玉大人款慨,你說我怎么就攤上這事∶ǎ” “怎么了檩奠?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長附帽。 經(jīng)常有香客問我埠戳,道長,這世上最難降的妖魔是什么蕉扮? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任整胃,我火速辦了婚禮,結(jié)果婚禮上喳钟,老公的妹妹穿的比我還像新娘屁使。我一直安慰自己,他們只是感情好奔则,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布蛮寂。 她就那樣靜靜地躺著,像睡著了一般应狱。 火紅的嫁衣襯著肌膚如雪共郭。 梳的紋絲不亂的頭發(fā)上祠丝,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天疾呻,我揣著相機(jī)與錄音除嘹,去河邊找鬼。 笑死岸蜗,一個(gè)胖子當(dāng)著我的面吹牛尉咕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播璃岳,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼年缎,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了铃慷?” 一聲冷哼從身側(cè)響起单芜,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎犁柜,沒想到半個(gè)月后洲鸠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡馋缅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年扒腕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萤悴。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瘾腰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出覆履,到底是詐尸還是另有隱情蹋盆,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布内狗,位于F島的核電站怪嫌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏柳沙。R本人自食惡果不足惜岩灭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赂鲤。 院中可真熱鬧噪径,春花似錦、人聲如沸数初。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泡孩。三九已至车摄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吮播。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國打工变屁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人意狠。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓粟关,卻偏偏與公主長得像,于是被迫代替她去往敵國和親环戈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子闷板,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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

  • 詳見 1.retain:始終是淺復(fù)制。引用計(jì)數(shù)每次加一院塞。返回對(duì)象是否可變與被復(fù)制的對(duì)象保持一致遮晚。2.copy:對(duì)于...
    樂樂的熊閱讀 244評(píng)論 0 0
  • 1、對(duì)象拷貝有兩種方式:淺復(fù)制和深復(fù)制拦止。顧名思義鹏漆,淺復(fù)制,并不拷貝對(duì)象本身创泄,僅僅是拷貝指向?qū)ο蟮闹羔樢樟幔簧顝?fù)制是直接...
    滴答大閱讀 772評(píng)論 0 2
  • 深拷貝和淺拷貝這個(gè)問題在面試中常常被問到,而在實(shí)際開發(fā)中鞠抑,只要稍有不慎饭聚,就會(huì)在這里出現(xiàn)問題。尤其對(duì)于初學(xué)者來說搁拙,我...
    西門淋雨閱讀 1,786評(píng)論 0 1
  • 導(dǎo)讀 最近經(jīng)常在關(guān)注的公眾號(hào)或者技術(shù)網(wǎng)站看到關(guān)于 iOS 深拷貝與淺拷貝的話題秒梳。看到一篇技術(shù)文章箕速,點(diǎn)擊收藏或者只是...
    獨(dú)木舟的木閱讀 674評(píng)論 0 8
  • 參考文獻(xiàn)《招聘一個(gè)靠譜的iOS》 深拷貝和淺拷貝 由上面的圖我們可以明確地看出酪碘, 淺拷貝(Shallow copy...
    Terrnce閱讀 1,830評(píng)論 2 10