淺 復
制:在複製操作時,對於被複製的物件的每一層複製都是指標複製。
深 復
制:在複製操作時,對於被複製的物件至少有一層複製是物件複製。
完全複製:在複製操作時,對於被複製的物件的每一層複製都是物件複製。
注: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;}
oc 深淺複製
淺 復 制 在複製操作時,對於被複製的物件的每一層複製都是指標複製。深 復 制 在複製操作時,對於被複製的物件至少有一層複製是物件複製。完全複製 在複製操作時,對於被複製的物件的每一層複製都是物件複製。注 1 在複製操作時,對於物件有n層是物件複製,我們可稱作n級深複製,此處n應大於等於1。2 對於...
OC深淺複製問題
呢。這裡為了便於朋友們理解,定義如下。淺 復 制 在複製操作時,對於被複製的物件的每一層複製都是指標複製。深 復 制 在複製操作時,對於被複製的物件至少有一層複製是物件複製。完全複製 在複製操作時,對於被複製的物件的每一層複製都是物件複製。注 1 在複製操作時,對於物件有n層是物件複製,我們可稱作n...
深淺複製 2
前面講了深淺複製的概念,而實操中我們會遇到更多的情況 我們可以看到這兩個copywithzone方法在arc下已經是放棄了,這兩個方法的使用非常簡單,一般的格式如下 1.實現nscopying協議 2.實現copywithzone方法 3.呼叫 我們看看結果 結果非常明顯了,這類似於上篇所講的情況,...