iOS 深拷貝及淺拷貝的區(qū)別

一、淺拷貝及深拷貝

1、淺拷貝(指針copy)

1)相當(dāng)于對(duì)指向?qū)ο蟮闹羔樳M(jìn)行復(fù)制,產(chǎn)生一個(gè)新的指向?qū)ο蟮闹羔槪?/p>

2)就有兩個(gè)指針指向同一個(gè)對(duì)象;

3)這個(gè)對(duì)象銷毀后,兩個(gè)指針都應(yīng)置空;

4)對(duì)象引用計(jì)數(shù)+1

2、深拷貝(內(nèi)容copy)

深copy不僅會(huì)復(fù)制對(duì)象本身,而且會(huì)遞歸復(fù)制每個(gè)指針類型的實(shí)例變量,直到兩個(gè)對(duì)象沒有任何公共的部分。

1)相當(dāng)于對(duì)對(duì)象進(jìn)行復(fù)制,產(chǎn)生一個(gè)新的對(duì)象;

2)就有兩個(gè)指針?lè)謩e指向兩個(gè)對(duì)象;

3)當(dāng)其中一個(gè)對(duì)象改變或者銷毀后,另一個(gè)對(duì)象不受影響;

4)源對(duì)象引用計(jì)數(shù)不變,副本計(jì)數(shù)器設(shè)置為1


二、copy及mutableCopy

? ? NSObject類提供了copy和mutableCopy方法,通過(guò)這兩個(gè)方法即可復(fù)制已有對(duì)象的副本。

? ? ?NSString,NSMUtablestring等系統(tǒng)類默認(rèn)遵守NSCoppying及NSMUtableCoppying協(xié)議。

? ? ?只有不可變對(duì)象創(chuàng)建的不可變副本(copy)才是淺copy,其它都是深copy。

1、copy方法

1)只要調(diào)用copy方法,總是返回對(duì)象的不可修改的副本。即便該對(duì)象本身是可修改的

2)eg: 調(diào)用NSMUtableString的copy方法,將返回不可修改的字符串對(duì)象。

2、mutableCopy方法

1)只要調(diào)用mutableCopy方法,總是返回對(duì)象的可變副本。即便該對(duì)象本身是不可修改的。

2)eg: 調(diào)用NSString的mutableCopy方法,總是返回對(duì)象的可修改的字符串對(duì)象。

3、示例代碼

4、系統(tǒng)對(duì)象總結(jié)

1、對(duì)于系統(tǒng)的非容器類對(duì)象(eg:NSString,NSMUtableString)

如果對(duì)[不可變]對(duì)象復(fù)制,copy是指針復(fù)制(淺拷貝), mutableCopy就是對(duì)象復(fù)制(深拷貝)。

如果是對(duì)可變對(duì)象復(fù)制,都是深拷貝,但是copy返回的對(duì)象是不可變的。

2、對(duì)于系統(tǒng)的容器類對(duì)象(eg:NSArray ,NSDictionary)

對(duì)于容器類本身,上面討論的結(jié)論也是適用的,只不過(guò)是容器對(duì)象中的元素是是淺copy。

5、自定義類調(diào)用copy與mutableCopy復(fù)制對(duì)象的副本

聲明協(xié)議
重寫方法
調(diào)用

6、setter方法的copy選項(xiàng)

1)copy指示符就是指定當(dāng)前程序調(diào)用setter方法復(fù)制時(shí),實(shí)際上是將傳入?yún)?shù)的副本賦值給程序的實(shí)例變量。(通過(guò)點(diǎn)語(yǔ)法賦值時(shí),實(shí)際上調(diào)用的就是setter方法)

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