iOS中深拷貝和淺拷貝的3種理解和1個注意點

2021-06-27 17:05:39 字數 1852 閱讀 1435

在ios開發中,經常涉及到深拷貝和淺拷貝的問題,針對深拷貝和淺拷貝,為了方便大家的理解,專門總結了以下3種方式(其實本質是一樣的)。

一. 理解一

淺拷貝是拷貝操作後,並沒有進行真正的複製,而是另乙個指標也指向了同乙個位址。深拷貝,拷貝操作後,是真正的複製了乙份,另乙個指標指向了,拷貝後的位址。如下圖:a代表原有的指標,b代表拷貝的指標。(圖一為淺拷貝,圖二為深拷貝)。

從上圖中可以看到,淺拷貝(淺複製)中如果其中a指標改變了所指向的位址的內容,那麼b指標也指向被修改後的內容。如果有些地方用到b指標,即便a指向的內容發生變化,也不希望b受到影響,則需要用深拷貝,真正複製乙份a指向的內容,b指向複製後的值,這樣即使a指向的內容變化了,b也不會產生影響。網上也有人通俗理解為:淺複製好比你和你的影子,你完蛋,你的影子也完蛋。深複製好比你和你的複製人,你完蛋,你的複製人還活著。

二. 理解二

深拷貝和淺拷貝的本質是位址相同,就是淺拷貝,位址不同就是深拷貝。

ios開發過程中,大體上會區分為物件和容器兩個概念,物件的copy是淺拷貝,mutablecopy是深拷貝。容器也參照如上方法,但是需要記住,容器的包含物件的拷貝,無論使用copy,還是mutablecopy都將是淺拷貝。要想實現物件的深拷貝,必須自己提供拷貝的方法。自己提供的方法見下面的注意點。

三. 理解三(**方式)

nsarray *array=[nsarray arraywithobjects:@"one",@"two", nil];       

nsmutablearray *array1=[array copy];        

[array1 addobject:@"three"];  

//這段**是錯誤的。array1,通過copy進行的是淺拷貝,即並沒有真正複製array,而是也指向了array,此時array是不可變陣列,無法進行新資料的新增

nsarray *array=[nsarray arraywithobjects:@"one",@"two", nil];       

nsmutablearray *array2=[array mutablecopy];        

[array2 addobject:@"three"];  

//這段**是正確的,array2通過mutablecopy進行的是深拷貝,即把array真正複製了乙份,並且複製後,變為了nsmutablearray ,此時array2是可變陣列,可以新增資料。

注意點:(1)當使用mutablecopy時,不管源物件是否可變,副本是可變的,並且實現真正意義上的拷貝。

當我們使用copy乙個可變物件時,副本物件是不可變的。

(2)要想實現物件的自定義拷貝,必須實現nscopying,nsmutablecopying協議,實現該協議的copywithzone方法和mutablecopywithzone方法。深拷貝和淺拷貝的區別就在於copywithzone方法的實現。

iOS偽拷貝, 淺拷貝, 深拷貝

先來說說偽拷貝。偽拷貝就是生成了乙個指標變數,指向了某乙個物件。接下來我們來 下淺拷貝和深拷貝。首先,從copy開始說,簡而言之,copy的目的就是生成乙個新的例項,然後把其成員都按原例項賦值。對於非指標型的成員,比如bool,int,float,這樣的賦值可以直接進行。但是對於指標型的資料,比如o...

IOS中的深拷貝與淺拷貝

簡單的來說就是,在有指標的情況下,淺拷貝只是增加了乙個指標指向已經存在的記憶體,而深拷貝就是增加乙個指標並且申請乙個新的記憶體,使這個增加的指標指向這個新的記憶體,採用深拷貝的情況下,釋放記憶體的時候就不會出現在淺拷貝時重複釋放同一記憶體的錯誤!我列舉乙個例子來說吧 你正在編寫c 程式中有時用到,操...

iOS 深拷貝淺拷貝例項

nsstring string 漢斯哈哈哈 沒有產生新物件 nsstring copystring string copy 產生新物件 nsmutablestring mutablecopystring string mutablecopy nslog string p copystring p m...