最近又回憶了一下淺拷貝,深拷貝摹恰。之前理解的不夠透徹,現(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)步!