小議iOS中的淺復(fù)制和深復(fù)制

前言:

提到iOS中的淺復(fù)制和深復(fù)制的區(qū)別鸿捧,大家都知道淺復(fù)制過(guò)來(lái)的是對(duì)象的地址嗤军,而深復(fù)制靶瘸,相當(dāng)于重新開辟了內(nèi)存空間寝优,存儲(chǔ)這個(gè)對(duì)象条舔。


用代碼說(shuō)話

①單個(gè)對(duì)象的淺復(fù)制與深復(fù)制

/// 單個(gè)對(duì)象 淺復(fù)制、深賦值
- (void)ordinaryCopyVSMutableCopy {
    
    NSString *str = @"hehe";
    NSLog(@"源字符:%p",str);
    
    //淺
    NSString *cStr = [str copy];
    NSLog(@"淺復(fù)制: Cstr = %p",cStr);
    
    NSString *temp = [str copyWithZone:nil];
    NSLog(@"copyWithZone: temp = %p",temp);
    
    //深
    NSString *mStr = [str mutableCopy];
    NSLog(@"深復(fù)制: mStr = %p",mStr);
}

輸出結(jié)果:

單個(gè)對(duì)象深淺復(fù)制輸出結(jié)果.png

tips:可以看到 copy乏矾、copyWithZone方法都是淺復(fù)制逞刷,對(duì)象的地址并沒(méi)有改變,而mutableCopy重新開辟了內(nèi)存控件妻熊,是深復(fù)制

數(shù)組及集合類對(duì)象的淺復(fù)制夸浅、深復(fù)制、完全復(fù)制

我們先定義一個(gè)原始數(shù)組

NSArray *originArr = [NSArray arrayWithObjects:@"1",@"2", nil];
NSLog(@"原數(shù)組 地址:%p",originArr);
NSLog(@"原數(shù)組中對(duì)象的地址: %p,%p \n",originArr[0],originArr[1]);

看代碼:

①對(duì)數(shù)組進(jìn)行淺復(fù)制
//對(duì)數(shù)組進(jìn)行淺復(fù)制
  NSArray *copyArr = [originArr copy];
  NSLog(@"淺復(fù)制 地址:%p",copyArr);
  NSLog(@"淺復(fù)制數(shù)組中對(duì)象的地址: %p,%p \n",copyArr[0],copyArr[1]);

對(duì)比輸出結(jié)果看:

數(shù)組淺復(fù)制結(jié)果對(duì)比.png

tips:可以看到 不論是數(shù)組本身還是數(shù)組中的元素扔役,地址都沒(méi)有發(fā)生變化帆喇,這就是完完全全的淺復(fù)制
那么問(wèn)題1:[NSArray arrayWithArray:originArr] 是淺復(fù)制 還是 深復(fù)制呢

 NSArray *arr = [NSArray arrayWithArray:originArr];
 NSLog(@"arrayWithArray深復(fù)制 地址:%p",arr);
 NSLog(@"arrayWithArray深復(fù)制數(shù)組中對(duì)象的地址: %p,%p \n",arr[0],arr[1]);

結(jié)果:

arrayWithArray結(jié)果.png

tips:arr相比于源數(shù)組,算是一次深復(fù)制亿胸,但是數(shù)組中的元素地址依舊沒(méi)有發(fā)生變化

②對(duì)數(shù)組進(jìn)行深復(fù)制
 NSArray *mCopyArr = [originArr mutableCopy];
 NSLog(@"深復(fù)制 地址:%p",mCopyArr);
 NSLog(@"深復(fù)制數(shù)組中對(duì)象的地址: %p,%p \n",mCopyArr[0],mCopyArr[1]);

打印地址發(fā)現(xiàn):

數(shù)組深復(fù)制.png
]
可以發(fā)現(xiàn)mCopyArr相比于原先的數(shù)組算是深復(fù)制了坯钦,但是內(nèi)部的元素依舊是原先數(shù)組中的元素

問(wèn)題2:[[NSArray alloc] initWithArray:.... copyItems:true] 是淺復(fù)制 還是 深復(fù)制呢

 NSArray *array = [[NSArray alloc] initWithObjects:[[NSMutableString alloc] initWithString:@"1"], @"2",nil];
 NSLog(@"array 地址: %p",array);
 NSLog(@"array中元素的地址 :%p,%p",array[0],array[1]);
    
 NSArray *arrWithCopyItem = [[NSArray alloc] initWithArray:array copyItems:true];
 NSLog(@"arrWithCopyItem深復(fù)制 地址:%p",arrWithCopyItem);
 NSLog(@"arrWithCopyItem深復(fù)制數(shù)組中對(duì)象的地址: %p,%p \n",arrWithCopyItem[0],arrWithCopyItem[1]);

輸出結(jié)果:

copyItems深復(fù)制、淺復(fù)制測(cè)試.png

可以看到侈玄,arrWithCopyItem對(duì)于源數(shù)組array中的可變對(duì)象進(jìn)行的是深復(fù)制婉刀,對(duì)不可變對(duì)象做的是淺復(fù)制,所以可以稱,[[NSArray alloc] initWithArray:.... copyItems:true]方法是與源數(shù)組做了一次不完全的深復(fù)制序仙,對(duì)于其中的不可變對(duì)象依舊是淺復(fù)制
tips:字典的[NSDictionary alloc] initWithDictionary:... copyItems:..這個(gè)方法結(jié)果同上

問(wèn)題來(lái)了:這不算真正意義上的深復(fù)制突颊,即完全復(fù)制,那用什么方法可以實(shí)現(xiàn)完全復(fù)制呢?

②對(duì)數(shù)組進(jìn)行完全復(fù)制

方法有很多種,這里簡(jiǎn)單介紹兩種:
一:歸檔律秃、解擋操作

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:originArr];
NSData *aData = [NSKeyedUnarchiver unarchiveObjectWithData:data];
NSArray *mmCopyArr = (NSArray *)aData;
NSLog(@"①歸檔深復(fù)制 地址:%p",mmCopyArr);
NSLog(@"①歸檔深復(fù)制數(shù)組中對(duì)象的地址: %p,%p \n",mmCopyArr[0],mmCopyArr[1]);
源數(shù)組.png

歸檔爬橡、解檔后.png

可以看到,不僅數(shù)組本身為深復(fù)制棒动,數(shù)組中的元素也都重新開辟了內(nèi)存空間

二:對(duì)數(shù)組進(jìn)行遍歷深復(fù)制糙申,該方法較為簡(jiǎn)單,就不寫代碼了

Github項(xiàng)目地址

點(diǎn)擊去我的Github下載Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末船惨,一起剝皮案震驚了整個(gè)濱河市柜裸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌粱锐,老刑警劉巖粘室,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異卜范,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)鹿榜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門海雪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人舱殿,你說(shuō)我怎么就攤上這事奥裸。” “怎么了沪袭?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵湾宙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我冈绊,道長(zhǎng)侠鳄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任死宣,我火速辦了婚禮伟恶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘毅该。我一直安慰自己博秫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布眶掌。 她就那樣靜靜地躺著挡育,像睡著了一般。 火紅的嫁衣襯著肌膚如雪朴爬。 梳的紋絲不亂的頭發(fā)上即寒,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼蒿叠。 笑死明垢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的市咽。 我是一名探鬼主播痊银,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼施绎!你這毒婦竟也來(lái)了溯革?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谷醉,失蹤者是張志新(化名)和其女友劉穎致稀,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俱尼,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抖单,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了遇八。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矛绘。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖刃永,靈堂內(nèi)的尸體忽然破棺而出货矮,到底是詐尸還是另有隱情,我是刑警寧澤斯够,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布囚玫,位于F島的核電站,受9級(jí)特大地震影響读规,放射性物質(zhì)發(fā)生泄漏抓督。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一束亏、第九天 我趴在偏房一處隱蔽的房頂上張望本昏。 院中可真熱鬧,春花似錦枪汪、人聲如沸涌穆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宿稀。三九已至,卻和暖如春赖捌,著一層夾襖步出監(jiān)牢的瞬間祝沸,已是汗流浹背矮烹。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工罩锐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人涩惑。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓仁期,卻偏偏與公主長(zhǎng)得像竭恬,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子痊硕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • 1. 屬性中copy與strong特性的區(qū)別 在開始學(xué)習(xí)淺復(fù)制(Shallow Copy)、深復(fù)制(Deep Co...
    pro648閱讀 1,731評(píng)論 2 16
  • 1预烙、對(duì)象拷貝有兩種方式:淺復(fù)制和深復(fù)制。顧名思義道媚,淺復(fù)制扁掸,并不拷貝對(duì)象本身,僅僅是拷貝指向?qū)ο蟮闹羔樧钣颍簧顝?fù)制是直接...
    滴答大閱讀 775評(píng)論 0 2
  • 本文為轉(zhuǎn)載: 作者:zyydeveloper 鏈接:http://www.reibang.com/p/5f776a...
    Buddha_like閱讀 882評(píng)論 0 2
  • A:我要?jiǎng)?chuàng)業(yè)啦谴分! B:就你… A:嗯,我要超越馬云… B:哈哈…你要超越馬云…我還超越秦始皇那… A:真的镀脂,我在做...
    我重生閱讀 257評(píng)論 0 0
  • 成安二中閱讀 147評(píng)論 0 0