OC 深拷貝和淺拷貝的理解

最近又回憶了一下淺拷貝,深拷貝摹恰。之前理解的不夠透徹,現(xiàn)在開始梳理一下携御。

OC語言中拷貝分為三類:淺拷貝诱咏,不完全深拷貝苔可,完全深拷貝

淺拷貝:沒有開辟新的指針地址,只是將新對(duì)象指向原來的指針袋狞,并沒有進(jìn)行真正的復(fù)制焚辅。如下圖:

深拷貝:深拷貝分為不完全深拷貝,完全深拷貝

不完全深拷貝:開辟了新的指針地址苟鸯,但是如果copy的對(duì)象是容器類(NSArray等),容器內(nèi)的元素還是原來的元素(容器內(nèi)的元素指針地址指向同一塊內(nèi)存)同蜻。不完全深拷貝拷貝的只是一個(gè)容器對(duì)象,只是外殼早处。容器內(nèi)的對(duì)象只保存一份引用

可以看見湾蔓,上面的數(shù)組內(nèi)的元素地址是一樣的,但是兩個(gè)數(shù)組的指針地址并不一樣

完全深拷貝:開辟了新的指針地址陕赃,而且如果拷貝的對(duì)象是容器類(NSArray等)卵蛉,容器內(nèi)的元素同樣也深拷貝了,開辟了新的內(nèi)存空間么库,即容器內(nèi)元素指針地址也改變了。完全深拷貝是連同容器和內(nèi)容對(duì)象一起拷貝一份甘有,完完全全的拷貝诉儒。使用系統(tǒng)方法:[NSAarray alloc]initWithArray:array1 copyItems: YES];進(jìn)行完全深拷貝亏掀,但是只能拷貝里面的一層忱反。

在上面的方法里,因?yàn)檫M(jìn)行了深拷貝滤愕,所以温算,改變mutArray2[2]的元素的時(shí)候,是單獨(dú)的改變间影,并不會(huì)影響mutArray3[2]的元素注竿,看下面打印的結(jié)果

但是,我們?nèi)绻淖兩顚哟蔚脑啬鼗瓯幔瑪?shù)組里面的數(shù)組元素呢巩割。上面測(cè)試中,我分別打印了mutArray2[3][3] 和mutArray3[3][3] 的地址付燥,發(fā)現(xiàn)兩個(gè)是一樣的宣谈,并未改變,(說明深拷貝沒到這一層键科,只是不完全深拷貝)闻丑,下面改變?mutArray2[3][3]里面的元素漩怎,那么mutArray3[3][3]里面的元素也會(huì)改變。

添加代碼: mutArray2[3][3][3] = @“it will not copy”嗦嗡;看下圖打印結(jié)果

里面的元素同時(shí)發(fā)生了改變勋锤,并且地址一樣

拷貝的目的是產(chǎn)生兩個(gè)互不影響的對(duì)象,所以:

1. 對(duì)于不可變的對(duì)象來說酸钦,由于對(duì)象本身不可以進(jìn)行改變怪得,即不能對(duì)它產(chǎn)生影響。所以不可變對(duì)象的copy都是淺拷貝

2.不可變對(duì)象的mutableCopy是深拷貝 (這里所指的深拷貝是不完全深拷貝)

3.可變對(duì)象的copy是深拷貝

4.可變對(duì)象的mutableCopy是深拷貝

以下是不完全深拷貝的理解

當(dāng)我們修改copyArray的時(shí)候卑硫,并不會(huì)影響到Array徒恋,但是修改copyArray里的objc的時(shí)候,array里面的objc也會(huì)改變


以下是完全深拷貝的理解

完全深拷貝是連同容器和內(nèi)容對(duì)象一起拷貝一份欢伏,完完全全的拷貝入挣,我們不論是修改copyArray還是修改copyArray里面的objc都不會(huì)影響到array和array里面的objc

默認(rèn)情況下的深拷貝都是不完全深拷貝,如果需要實(shí)現(xiàn)完全深拷貝硝拧,使用下面的方法:

對(duì)于容器對(duì)象径筏,也完全遵守上面的情況,只不過發(fā)生深拷貝時(shí)對(duì)容器對(duì)象本身來說是深拷貝障陶,因?yàn)楫a(chǎn)生了新對(duì)象滋恬,而對(duì)容器內(nèi)的元素來說是淺拷貝。即:修改容器內(nèi)的元素抱究,無論是原來對(duì)象還是拷貝產(chǎn)生的新對(duì)象恢氯,兩個(gè)容器內(nèi)的元素都會(huì)發(fā)生改變,因?yàn)槿萜鲀?nèi)存的是容器元素的內(nèi)存地址鼓寺。如果想讓容器對(duì)象本身及容器內(nèi)的元素都發(fā)生完全深拷貝勋拟,使用[NSAarray alloc]initWithArray:array1 copyItems: YES]; 才能真正的實(shí)現(xiàn)完全深拷貝。后面的item一定要設(shè)置為YES才是完全深拷貝(這句代碼只能進(jìn)行一次深拷貝妈候,比如數(shù)組里多層嵌套數(shù)組敢靡,只會(huì)拷貝外面的那層,如果要多次進(jìn)行深拷貝苦银,需要用到歸檔和解檔)

淺拷貝啸胧,深拷貝,完全拷貝的區(qū)別

淺拷貝墓毒,在淺拷貝操作時(shí)吓揪,對(duì)于被拷貝對(duì)象的每一層都是指針復(fù)制

深拷貝,在深拷貝操作時(shí)所计,對(duì)于被拷貝對(duì)象柠辞,至少有一層是深拷貝

完全拷貝,在完全拷貝操作時(shí)主胧,對(duì)于被拷貝對(duì)象的每一層都是對(duì)象拷貝

以上是我從網(wǎng)上摘取深淺拷貝有關(guān)知識(shí)的整理叭首,平時(shí)我一般用深淺copy很少习勤,也就是需要對(duì)對(duì)象狀態(tài)改變,進(jìn)行比較的時(shí)候所用到過焙格。图毕。如果有不對(duì)的內(nèi)容,請(qǐng)大家指出來眷唉。畢竟予颤,交流使我們進(jìn)步!


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末冬阳,一起剝皮案震驚了整個(gè)濱河市蛤虐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肝陪,老刑警劉巖驳庭,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異氯窍,居然都是意外死亡饲常,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門狼讨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贝淤,“玉大人,你說我怎么就攤上這事政供∨Γ” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵鲫骗,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我踩晶,道長(zhǎng)执泰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任渡蜻,我火速辦了婚禮术吝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘茸苇。我一直安慰自己排苍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布学密。 她就那樣靜靜地躺著淘衙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腻暮。 梳的紋絲不亂的頭發(fā)上彤守,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天毯侦,我揣著相機(jī)與錄音,去河邊找鬼具垫。 笑死侈离,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的筝蚕。 我是一名探鬼主播卦碾,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼起宽!你這毒婦竟也來了洲胖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤燎含,失蹤者是張志新(化名)和其女友劉穎宾濒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屏箍,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绘梦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赴魁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卸奉。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖颖御,靈堂內(nèi)的尸體忽然破棺而出榄棵,到底是詐尸還是另有隱情,我是刑警寧澤潘拱,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布疹鳄,位于F島的核電站,受9級(jí)特大地震影響芦岂,放射性物質(zhì)發(fā)生泄漏瘪弓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一禽最、第九天 我趴在偏房一處隱蔽的房頂上張望腺怯。 院中可真熱鬧,春花似錦川无、人聲如沸呛占。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晾虑。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間走贪,已是汗流浹背佛猛。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坠狡,地道東北人继找。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像逃沿,于是被迫代替她去往敵國和親婴渡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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

  • 1凯亮、對(duì)象拷貝有兩種方式:淺復(fù)制和深復(fù)制边臼。顧名思義,淺復(fù)制假消,并不拷貝對(duì)象本身柠并,僅僅是拷貝指向?qū)ο蟮闹羔槪簧顝?fù)制是直接...
    滴答大閱讀 772評(píng)論 0 2
  • 這篇文章主要翻譯apple的官方文檔和其他類似博文的學(xué)習(xí)記錄 Copying Collections 概念 拷貝的...
    devZhang閱讀 3,028評(píng)論 3 23
  • 1富拗、淺拷貝: 拷貝了指向?qū)ο蟮闹羔?并沒有復(fù)制對(duì)象本身,兩個(gè)指針指向同一片地址空間. 2臼予、深拷貝:重新復(fù)制了一個(gè)新...
    一滴礦泉水閱讀 471評(píng)論 0 1
  • 引子 淺拷貝:指針拷貝粘拾,引用拷貝,指向同一內(nèi)存地址 深拷貝:內(nèi)容拷貝创千,指向不同內(nèi)存地址缰雇,但是內(nèi)容相同 容器類拷貝的...
    小白進(jìn)城閱讀 1,584評(píng)論 1 9
  • 天剛蒙蒙亮 便起床為新一天而準(zhǔn)備 該慶幸 又看到了新一天的太陽 早七點(diǎn) 踏上工作的路途 忙碌的一天 就這樣迎著朝陽...
    一言一諾閱讀 238評(píng)論 1 2