首先我們先搞清楚深拷貝和淺拷貝的概念吧:
深拷貝:內(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é)議。