深淺拷貝iOS中的

2021-07-07 04:32:46 字數 2768 閱讀 5555

淺 復

:在複製操作時,對於被複製的物件的每一層複製都是指標複製。

深 復

:在複製操作時,對於被複製的物件至少有一層複製是物件複製。

完全複製:在複製操作時,對於被複製的物件的每一層複製都是物件複製。

注:1在複製操作時,對於物件有n層是物件複製,我們可稱作n級深複製,此處n應大於等於1。

2對於完全複製如何實現(目前通用的辦法是:迭代法和歸檔)

,這裡後續是否新增

視情況而定,

暫時不做講解。

3、指標複製俗稱指標拷貝,

物件複製也俗稱內容拷貝。

4、一般來講,

淺層複製:複製引用物件的指標。

深層複製:複製引用物件內容。

這種定義在多層複製的時候,就顯得模糊。所以本文定義與它並不矛盾。

反而是對它的進一步理解和說明。  

retain:始終是淺複製。引用計數每次加一。返回物件是否可變與被複製的物件保持一致。

copy:對於可變物件為深複製,引用計數不改變;對於不可變物件是淺複製,

引用計數每次加一。始終返回乙個不可變物件。

mutablecopy:始終是深複製,引用計數不改變。始終返回乙個可變物件。

不可變物件

可變物件

最近有乙個好朋友問我,什麼時候用到深淺複製呢?那麼我就把我所總結的一些分享給大家,希望能幫助你們更好的理解深淺複製喔!

那麼先讓我們來看一看下邊陣列型別的轉換

1、不可變物件→可變物件的轉換:

nsarray 

*array1= [

nsarray arraywithobjects

:@"a"

,@"b"

,@"c"

,@"d"

,nil];

nsmutablearray

*str2=[

array1 

mutablecopy];

2、可變物件→不可變物件的轉換:

nsmutablearray

*array2   = [

nsmutablearray

arraywithobjects:@"aa",@"bb",@"cc",@"dd",nil];

nsarray 

*array1=[  

array2  

copy];

3、可變物件→可變物件的轉換(不同指標變數指向不同的記憶體位址):

nsmutablearray

*array1= [

nsmutablearray

arraywithobjects

:@"a"

,@"b"

,@"c"

,@"d"

,nil];

nsmutablearray

*str2=[

array1 

mutablecopy];

通過上邊的兩個例子,我們可輕鬆的將乙個物件在可變和不可變之間轉換,並且這裡不用考慮記憶體使用原則(即引用計數的問題)。沒錯,這就是深拷貝的魅力了。

4、同型別物件之間的導向保持(不同指標變數指向同一塊記憶體位址):

a、

nsmutablestring

*str1=[

nsmutablestring

stringwithstring:@"two day"];

nsmutablestring

*str2=[str1  

retain];

[str1  release];

b、 nsarray 

*array1= [

nsarray arraywithobjects

:@"a"

,@"b"

,@"c"

,@"d"

,nil];

nsarray 

*str2=[

array1 

copy];

[array1 release];

通俗的講,就是甲在執行交通導航任務,但接到上級新的命令要執行新的任務,那麼在甲執行新任務之前,需要有人替代甲繼續執行交通導航任務。這時候就要用到淺拷貝了。

則簡化為:

問:什麼時候用到深淺拷貝?

答:深拷貝是在要將乙個物件從可變(不可變)轉為不可變(可變)或者將乙個物件內容轉殖乙份時用到;

淺拷貝是在要複製乙個物件的指標時

用到。

#import

int main (int argc, const

char * argv)

return 0;

}

ios 深淺拷貝學習

這裡主要側重於集合類的深淺拷貝,主要事因為工作的時候遇到這個問題。首先我們需要有這樣的乙個前提 array addobject obj 這樣obj的引用計數會增加1,如果使用remove則obj的引用計數會減一。ios對集合的記憶體處理就是這樣的。那麼,假設obj只被array擁有 id temp ...

ios 深淺拷貝學習

這裡主要側重於集合類的深淺拷貝,主要事因為工作的時候遇到這個問題。首先我們需要有這樣的乙個前提 array addobject obj 這樣obj的引用計數會增加1,如果使用remove則obj的引用計數會減一。ios對集合的記憶體處理就是這樣的。那麼,假設obj只被array擁有 id temp ...

iOS基礎 深淺拷貝

其中有兩點需要注意 1 foundation類已經遵守了和 協議,即實現了copy和mutablecopy方法,因此foundation物件可以使用這些方法建立物件的副本或可變副本,例如 nsstring nsdictionary nsarray nsmutablearr 2 在ios中並不是所有的...