iOS面試篇--淺拷貝和深拷貝和copy關(guān)鍵字

前言

iOS面試中最經(jīng)常碰到的就是內(nèi)存方面的問(wèn)題,比如面試官問(wèn)你淺拷貝和深拷貝的區(qū)別,copy和stong關(guān)鍵字的區(qū)別,weak和assign的區(qū)別,以及衍生下去容器的拷貝以及元素如何深拷貝,等等。

正文

一、關(guān)于淺拷貝和深拷貝

讓我們來(lái)做一組實(shí)驗(yàn):1,非容器不可變對(duì)象的copy和mutablecopy

圖1

打印結(jié)果:

圖2

zifuchuan和copystr的地址都是0x10070b0e0說(shuō)明對(duì)zifuchuan的copy操作是指針拷貝,mutstr的地址是0x10070acd0,說(shuō)明對(duì)zifuchuan的mutablecopy操作是內(nèi)容拷貝。

2,非容器可變對(duì)象的copy和mutablecopy

圖3

打印結(jié)果:

圖4

其中mutablestr,copymutablesr,mutmutablestr的地址各不一樣,說(shuō)明對(duì)可變字符串的copy和mutableCopy操作都是內(nèi)容拷貝,mutalbeCopy拷貝的是可變字符串。

3,容器可變對(duì)象的copy和mutablecopy

圖5

打印結(jié)果:

圖6

copyarray的地址和array一樣都是0x100708390說(shuō)明不可變數(shù)組的copy操作是指針拷貝,mutcopyarray的地址是0x10070a9b0和array不一樣,說(shuō)明對(duì)不可變數(shù)組的mutableCopy操作是內(nèi)容拷貝,我們看一下array,copyarray,mutcopyarray三個(gè)數(shù)組的元素地址,都一樣沒(méi)有變說(shuō)明容器可變數(shù)組的元素是指針拷貝。

4,容器可變對(duì)象的copy和mutablecopy

圖7

打印結(jié)果:

圖8

mutarray,copymutarray,mutcopymutarray三個(gè)對(duì)象的地址分別為0x1007092a0,0x100709430,0x100709450,說(shuō)明對(duì)可變數(shù)組的copy和mutableCopy操作都是深拷貝,其中copy的對(duì)象是不可變的,mutableCopy的對(duì)象是可變的。我們?cè)诳匆幌氯齻€(gè)數(shù)組的元素地址,都是一樣,說(shuō)明對(duì)可變數(shù)組的元素拷貝也是指針拷貝

二、@property的copy關(guān)鍵字

關(guān)于copy關(guān)鍵字,用的較多的數(shù)據(jù)類型是NSString和block,但是有一種數(shù)據(jù)類型可變對(duì)象,若使用copy則很容易出錯(cuò),如NSMutableArray,NSMutableString。

圖9

對(duì)類的屬性testMutArray和testMutstring直接賦值,此時(shí)testMutArray和testMutstring屬性已經(jīng)變?yōu)椴豢勺儗?duì)象,因?yàn)閏opy關(guān)鍵字使內(nèi)存中的可變對(duì)象copy一份新的不可變對(duì)象。如圖9,把23和29行注釋去掉后運(yùn)行工程后直接crash,因?yàn)閟elf.testMutArray變量已經(jīng)是一個(gè)不可變數(shù)組,self.testMutstring是一個(gè)不可變字符串。

三、數(shù)組元素的深拷貝

我們知道數(shù)組的拷貝中無(wú)論是可變數(shù)組還是不可變數(shù)組,其元素拷貝都是指針拷貝,那么有沒(méi)有方法可以讓它深拷貝呢。

1,有一種方法,創(chuàng)建新數(shù)組,遍歷數(shù)組中的元素,copy后加入新數(shù)組。

圖10

其中Person類需要實(shí)現(xiàn)NSCopying的協(xié)議方法- (id)copyWithZone:(NSZone*)zone,要不然對(duì)象無(wú)法拷貝。

圖11

2,還有一種方法是創(chuàng)建數(shù)組是使用[[NSMutableArray alloc] initWithArray:arr copyItems:YES] 方法,前提是數(shù)組中的元素若是對(duì)象也必須實(shí)現(xiàn)NSCopying或NSMutableCopying協(xié)議方法。

圖12

如圖12,23行和27行打印出來(lái)的元素對(duì)象地址是不一樣的:

圖13

說(shuō)明元素已經(jīng)深拷貝了。好了,本篇介紹就到這里。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容