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

一、概念
  • 淺拷貝——只拷貝指向?qū)ο蟮闹羔?,不拷貝引用?duì)象本身。
  • 深拷貝——拷貝引用對(duì)象本身。
    將對(duì)象obj,拷貝后得到obj-copy。對(duì)于淺拷貝來(lái)說(shuō),obj和obj-copy指向的是同一個(gè)內(nèi)存資源,拷貝的只是一個(gè)指針,對(duì)象資源還是只有一份。如果對(duì)obj-copy進(jìn)行修改,obj引用的對(duì)象也同樣被修改,因?yàn)閮蓚€(gè)指針指向的是同一個(gè)內(nèi)存資源。對(duì)于深拷貝來(lái)說(shuō),內(nèi)存中存在了兩份獨(dú)立的對(duì)象資源。
二、copy、mutableCopy
  • 1、對(duì)于不可變非集合對(duì)象,copy是淺拷貝,mutableCopy是深拷貝。
  • 2、對(duì)于可變非集合對(duì)象,copy、mutableCopy都是深拷貝。
  • 3、對(duì)于不可變的數(shù)組、字典、集合等集合類對(duì)象,copy是淺拷貝,mutableCopy是深拷貝。
  • 4、對(duì)于可變的數(shù)組、字典、集合等集合類對(duì)象,copy、mutableCopy都是深拷貝。
    【注】對(duì)于集合對(duì)象的深拷貝,僅僅拷貝對(duì)象本身,對(duì)象里面的元素都是淺拷貝。想要深拷貝整個(gè)集合對(duì)象,就要用到集合類深拷貝的方法,有如下兩種:
    (1)使用initWithArray:copyItems:、initWithDictionary:copyItems方法,將第二個(gè)參數(shù)設(shè)置為YES即可,例如:
NSArray *array = [[NSArray alloc] initWithArray:someArray copyItems:YES];

(2)將集合對(duì)象進(jìn)行歸檔(archive),然后解歸檔(unarchive),例如:

NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:someArray]];
?著作權(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)容

  • 1.淺拷貝 所謂的淺拷貝,就是指只是將對(duì)象內(nèi)存地址多了一個(gè)引用,也就是說(shuō),拷貝結(jié)束之后,兩個(gè)對(duì)象的值不僅相同,而且...
    小瓶子Zgp閱讀 1,896評(píng)論 1 2
  • 集合類型的拷貝 深拷貝是深度拷貝,是拷貝一個(gè)實(shí)例對(duì)象到一個(gè)新的內(nèi)存地址,而淺拷貝只是簡(jiǎn)單拷貝一個(gè)實(shí)例對(duì)象的指針。蘋...
    Longshihua閱讀 533評(píng)論 0 0
  • 在Objective-C中對(duì)象之間的拷貝分為淺拷貝和深拷貝。說(shuō)白了,對(duì)非容器類的淺拷貝就是拷貝對(duì)象的地址,對(duì)象里面...
    zhaihongxia閱讀 273評(píng)論 0 0
  • 導(dǎo)讀 最近經(jīng)常在關(guān)注的公眾號(hào)或者技術(shù)網(wǎng)站看到關(guān)于 iOS 深拷貝與淺拷貝的話題??吹揭黄夹g(shù)文章,點(diǎn)擊收藏或者只是...
    獨(dú)木舟的木閱讀 733評(píng)論 0 8
  • 首先介紹一下淺拷貝和深拷貝的概念。 淺拷貝:是指針拷貝,讓拷貝前和拷貝后對(duì)象的指針指向同一塊內(nèi)存地址。 增加了拷貝...
    _桃夭大人_閱讀 589評(píng)論 0 4

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