深拷貝和淺拷貝以及使對(duì)象能夠拷貝的條件

1、使對(duì)象具有拷貝功能

在自定義的類(lèi)里面實(shí)現(xiàn)NSCopying協(xié)議和NSMutableCopying協(xié)議,若沒(méi)有實(shí)現(xiàn)這兩個(gè)協(xié)議的話(huà),在實(shí)例化對(duì)象后調(diào)用copy/mutableCopy會(huì)報(bào)錯(cuò)。

為什么要使用copy?

copy是創(chuàng)建一個(gè)新對(duì)象,retain是創(chuàng)建一個(gè)指針,引用對(duì)象計(jì)數(shù)加1。copy屬性表示兩個(gè)對(duì)象內(nèi)容相同,新的對(duì)象引用為1?,與舊有對(duì)象的引用計(jì)數(shù)無(wú)關(guān),舊的對(duì)象并沒(méi)有變化。copy減少對(duì)象對(duì)上下文的依賴(lài)。copy過(guò)后的新對(duì)象會(huì)開(kāi)辟新的內(nèi)存空間。

對(duì)于系統(tǒng)的非容器類(lèi)對(duì)象(NSArray、NSMutableArray、NSDictionary、NSMutableDictionary等),可以認(rèn)為,如果對(duì)一不可變對(duì)象復(fù)制,copy是指針復(fù)制(淺拷貝)而mutableCopy就是對(duì)象復(fù)制(深拷貝)。如果是對(duì)可變對(duì)象復(fù)制,都是深拷貝,但是copy返回的對(duì)象是不可變的。

copy:對(duì)于可變對(duì)象為深復(fù)制,引用計(jì)數(shù)不改變;對(duì)于不可變對(duì)象是淺復(fù)制。引用計(jì)數(shù)每次+1。始終返回一個(gè)不可變對(duì)象。

mutableCopy:始終是深復(fù)制,引用計(jì)數(shù)不改變。始終返回一個(gè)可變對(duì)象

那么先讓我們來(lái)看一看下數(shù)組類(lèi)型的轉(zhuǎn)換

1、不可變對(duì)象→可變對(duì)象的轉(zhuǎn)換:

???????NSArray?*arr1= [NSArray arrayWithObjects:@"1",@"2",@"3",@"4",nil];

?????NSMutableArray?*arr2=[arr1?mutableCopy];

2、可變對(duì)象→不可變對(duì)象的轉(zhuǎn)換:

????NSMutableArray?*array1 ? = [NSMutableArray?arrayWithObjects:@"a1",@"b1",@"c1",@"d1",nil];

???????NSArray?*array2=[?array1 ? Copy];

3、可變對(duì)象→可變對(duì)象的轉(zhuǎn)換(不同指針變量指向不同的內(nèi)存地址)

???????NSMutableArray?*array1= [NSMutableArray?arrayWithObjects:@"a",@"b",@"c",@"d",nil];

?????NSMutableArray?*array2=[array1?mutableCopy];

通過(guò)上邊的兩個(gè)例子,我們可輕松的將一個(gè)對(duì)象在可變和不可變之間轉(zhuǎn)換,并且這里不用考慮內(nèi)存使用原則(即引用計(jì)數(shù)的問(wèn)題)。沒(méi)錯(cuò),這就是深拷貝的魅力了。

4、同類(lèi)型對(duì)象之間的指針復(fù)制(不同指針變量指向同一塊內(nèi)存地址):

??a、

?NSMutableString?*str1=[NSMutableString?stringWithString:@"two day"];

???NSMutableString?*str2=[str1??retain];

b、

???NSArray?*array1= [NSArray arrayWithObjects:@"a",@"b",@"c",@"d",nil];

???NSArray?*str2=[array1?Copy];


?通俗的講,多個(gè)指針同時(shí)指向同一塊內(nèi)存區(qū)域,那么這些個(gè)指針同時(shí)擁有對(duì)該內(nèi)存區(qū)的所有權(quán)。所有權(quán)的瓜分過(guò)程,這時(shí)候就要用到淺拷貝了。

可以把上面所有的問(wèn)題則簡(jiǎn)化如下:

什么時(shí)候用到深淺拷貝?

深拷貝(mutableCopy)是在要將一個(gè)對(duì)象從可變(不可變)轉(zhuǎn)為不可變(可變)或者將一個(gè)對(duì)象內(nèi)容克隆一份時(shí)用到;

淺拷貝(copy)是在要復(fù)制一個(gè)對(duì)象的指針時(shí)用到。

對(duì)可變對(duì)象使用 copy 和MutableCopy 都會(huì)拷貝一個(gè)新的對(duì)象出來(lái),即,copy 和 mutableCopy 都是深拷貝;

對(duì)不可變對(duì)象使用 copy, 新拷貝出來(lái)的對(duì)象地址和被拷貝對(duì)象地址一致?

對(duì)不可變對(duì)象使用 mutableCopy 新拷貝出來(lái)的對(duì)象和被拷貝的對(duì)象內(nèi)存地址發(fā)生變化,?

所以對(duì)不可變對(duì)象 copy 就是淺拷貝,mutableCopy 就是深拷貝.?

?著作權(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)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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