oc 深淺複製

2021-07-24 23:07:22 字數 1640 閱讀 5850

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

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

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

注: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];

nsmutablearray *array1= [nsmutablearray arraywithobjects:@"a",@"b",@"c",@"d",nil];

nsmutablearray *str2=[array1 mutablecopy];

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

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];

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

則簡化為:

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

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

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

#importint main (int argc, const char * argv)

return 0;

}

OC深淺複製問題

呢。這裡為了便於朋友們理解,定義如下。淺 復 制 在複製操作時,對於被複製的物件的每一層複製都是指標複製。深 復 制 在複製操作時,對於被複製的物件至少有一層複製是物件複製。完全複製 在複製操作時,對於被複製的物件的每一層複製都是物件複製。注 1 在複製操作時,對於物件有n層是物件複製,我們可稱作n...

OC筆記心得存檔 深淺複製

淺 復 制 在複製操作時,對於被複製的物件的每一層複製都是指標複製。深 復 制 在複製操作時,對於被複製的物件至少有一層複製是物件複製。完全複製 在複製操作時,對於被複製的物件的每一層複製都是物件複製。注 1 在複製操作時,對於物件有n層是物件複製,我們可稱作n級深複製,此處n應大於等於1。2 對於...

深淺複製 2

前面講了深淺複製的概念,而實操中我們會遇到更多的情況 我們可以看到這兩個copywithzone方法在arc下已經是放棄了,這兩個方法的使用非常簡單,一般的格式如下 1.實現nscopying協議 2.實現copywithzone方法 3.呼叫 我們看看結果 結果非常明顯了,這類似於上篇所講的情況,...