iOS關于copy,mutablecopy;深拷貝,淺拷貝的淺見

首先我們先搞清楚深拷貝和淺拷貝的概念吧:

深拷貝:內(nèi)存地址的拷貝,重新開辟一塊內(nèi)存區(qū)域,和原來的內(nèi)存區(qū)域不相關。

淺拷貝:僅僅只是指針的拷貝,指向同一塊內(nèi)存空間。

注意:copy出來的對象都是不可變對象。

下面我們具體分析一下:

1.copy的使用和理解

首先我們要了解copy的意義是什么,其實copy方法的存在就是復制一份和原來互不影響的數(shù)據(jù)。了解到這個就是我們使用的前提。

(1).對于不可變對象的copy是淺拷貝.

從簡單的開始:

NSLog(@"%p",@"1");

NSLog(@"%p",[@"1"copy]);

打印輸出的結果:

2019-12-16 21:54:16.647 Delegate[89515:460912] 0x10c6851a0

2019-12-16 21:54:16.647 Delegate[89515:460912] 0x10c6851a0

指針地址完全一樣,由此我們可以知道,對于不可變對象的copy只是指針的copy,也就是我們所說的淺拷貝,只是指針的拷貝。但是這個和我們所說的“和原來互不影響的數(shù)據(jù)”相違背了,為什么呢,其實蘋果早就幫我們考慮到了這一點的,我們完全不需要擔心這點的。

copy方法拷貝的對象都是不可變的對象,原來的字符串也是不可變的字符串,既然都是不可變的字符串,他們其實沒有必要生成2塊內(nèi)存的,可以共享內(nèi)存空間的,所以同一個指針就夠用了,能節(jié)省一點內(nèi)存是一點嘛(對于targetpoint同樣適用)。

有同學可能要問了,既然指向同一個內(nèi)存區(qū)域,那么我改變其中一個的值,另一個這不是也得改變嘛,我們來試一試

```

NSString*str1=@"str1";NSString*str2=[str1 copy];

```

我們改變str1的值,str2是不會改變的,這個時候他們會生成不同的內(nèi)存地址,也就是說新開辟了內(nèi)存空間。

(2)對于可變對象的copy,生成的是不可變對象。

2.mutablecopy的理解

(1)mutablecopy進行的拷貝都是深拷貝,重新開辟了內(nèi)存空間。

(2)mutablecopy對可變對象的mutablecopy是可變的,對于不可變對象的mutablecopy是不可變的。

3.對于數(shù)組中的copy其實對于數(shù)組里面的元素全都是指針copy,如果想要進行內(nèi)存copy需要重新操作數(shù)組;

4.對于自定義的對象,想要進行copy操作,需要實現(xiàn)nscopying或nsmutablecopying協(xié)議。同理,如果對一個數(shù)組進行copy,數(shù)組里面全都是自定義對象,那么這些對象全都要實現(xiàn)nscopying協(xié)議。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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