iOS相關(guān) | oc中深拷貝和淺拷貝,copy和strong

oc中對(duì)象的拷貝分為淺拷貝和深拷貝,又分為容器類對(duì)象和非容器類對(duì)象

1.?對(duì)非容器類對(duì)象(如NSString、NSMutableString類對(duì)象)使用淺拷貝:拷貝的是對(duì)象的地址,沒有新的內(nèi)存被分配,只是原來的那塊內(nèi)容多了一個(gè)指針指向。也就是說新對(duì)象跟原對(duì)象都是指向的同一個(gè)內(nèi)存地址,那么內(nèi)容當(dāng)然一樣。?

2.?對(duì)非容器類對(duì)象(如NSData、NSMutableData類對(duì)象)使用深拷貝:拷貝的是整個(gè)對(duì)象內(nèi)容了,是通過給新對(duì)象分配了一塊新的內(nèi)存,然后將原對(duì)象對(duì)應(yīng)內(nèi)存中的內(nèi)容一模一樣在新的內(nèi)存中寫一份。所以內(nèi)容是一樣的,但是此時(shí)新對(duì)象與原對(duì)象的內(nèi)存地址是不同的。?

3.?對(duì)容器類對(duì)象(如NSArray、NSMutableArray類對(duì)象)使用淺拷貝:新的容器類對(duì)象也是指向的新的內(nèi)存地址,但是容器內(nèi)保存的對(duì)象沒有進(jìn)行拷貝,指向的內(nèi)存地址還是和原容器對(duì)象內(nèi)保存的對(duì)象指向的內(nèi)存地址是一樣的。也就是說你改了其中一個(gè)容器對(duì)象中的元素對(duì)象,那么另一個(gè)容器對(duì)象中的元素對(duì)象也會(huì)相應(yīng)修改(是同一個(gè)內(nèi)存地址嘛)。?

4.?對(duì)容器類對(duì)象(如NSDictionary、NSMutableDictionary類對(duì)象)使用深拷貝:是需要對(duì)容器對(duì)象中的每一個(gè)元素都進(jìn)行拷貝

重點(diǎn):

在ARC下,我們是不可以對(duì)對(duì)象調(diào)用retain方法修改內(nèi)存的引用計(jì)數(shù)的。我們需要先理解一下MRC下的retain、copy和mutableCopy的特點(diǎn):

retain:始終是淺拷貝,讓新對(duì)象指針指向原對(duì)象,只是原來的內(nèi)存地址多了一個(gè)指針指向,引用計(jì)數(shù)增加了1(但是系統(tǒng)會(huì)進(jìn)行各種優(yōu)化,不一定會(huì)加,像常量的引用計(jì)數(shù)就一直保持-1,不會(huì)變動(dòng),所以對(duì)常量strong,進(jìn)行retain也還是不會(huì)變)。返回對(duì)象是否可變與被復(fù)制的對(duì)象保持一致。(與ARC中的strong一樣)?

copy:對(duì)于可變對(duì)象(NSMutableDictionary,NSMutableArray)為深復(fù)制(開辟新內(nèi)存,與原對(duì)象指向的不是一個(gè)對(duì)象了);對(duì)于不可變對(duì)象(NSDictionary,NSArray)是淺復(fù)制(不開辟新內(nèi)存,只是原內(nèi)存地址加了一個(gè)新的指針指向,引用計(jì)數(shù)加1)。返回的對(duì)象始終是一個(gè)不可變對(duì)象。?

mutableCopy:始終是深復(fù)制(開辟新內(nèi)存,與原來對(duì)象指向的內(nèi)存空間不是同一處了)。返回的對(duì)象始終是一個(gè)可變對(duì)象。

最后編輯于
?著作權(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)容