標籤:ios開發 淺複製 深複製 完全複製 歸檔解檔
寫於前:
在之前轉載的一片文章中,文中對淺複製和深複製進行了詳細的解讀,同時還提到了深複製(one-level-deep copy)、完全複製(true copy)的概念,並指出iOS開發中的深複製是單層深賦值,本文將對這幾個概念進行驗證梳理。
(單層和完全概念區分:例如多層數組只實現一層內容拷貝,其他層為指標拷貝成為單層深複製;若多層內容都實現拷貝稱為完全賦值)
程式中用到的幾點概念補充
(1)
淺複製(shallow copy):在淺複製操作時,對於被複製對象的每一層都是指標複製。
深複製(one-level-deep copy):在深複製操作時,對於被複製對象,至少有一層是深複製。
完全複製(real-deep copy):在完全複製操作時,對於被複製對象的每一層都是對象複製。
(2)
歸檔和解檔的概念補充:
有時存在這樣的需求,即將程式中使用的多個對象及其屬性值,以及它們的相互關係儲存到檔案中,或者發送給另外的進程。為了實現此功能,foundation架構中,可以把相互關聯的多個對象歸檔為二進位檔案,而且還能將對象的關係從二進位檔案中還原出來。
歸檔:將對象打包成二進位檔案。NSKeyedArchiver:歸檔器
解檔:歸檔的逆變換。NSKeyedUnarchiver:解檔器
因此可以利用歸檔和解檔來實現完全複製
代碼驗證
//建立多層數組 NSArray *array = @[@1,@2]; NSArray *oldArray = @[@"xxxx",array]; //淺複製 NSArray *shallowArray = [oldArray copy]; //深複製 NSArray *oneDeepLevelArray = [oldArray mutableCopy]; //完全深複製,利用歸檔和解檔的方式 NSArray *trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];
NSLog(@"%p,%p,%p,%p",oldArray,shallowArray,oneDeepLevelArray,trueDeepCopyArray);
輸出結果:
0x7fc7e9c1c0d0,0x7fc7e9c1c0d0,0x7fc7e9c0c5c0,0x7fc7e9c22ef0
從上述列印地址可以看出:
淺複製只是簡單的指標賦值,指向記憶體仍相同;
深複製,和完全深複製都實現了內容的複製,但是是否實現對被複製對象的每一層都複製,通過查看多層數組第二層元素的地址來驗證:
NSLog(@"shallow——%p,%p",oldArray[1][0],shallowArray[1][0]); NSLog(@"oneDeep——%p,%p",oldArray[1][0],oneDeepLevelArray[1][0]); NSLog(@"trueDeep——%p,%p",oldArray[1][0],trueDeepCopyArray[1][0]);
輸出結果:
shallow——0xb000000000000012,0xb000000000000012 oneDeep——0xb000000000000012,0xb000000000000012 trueDeep——0xb000000000000012,0xb000000000000013
結論
淺複製地址相同,這點毫無疑問
深複製地址也相同,就說明第二層元素並沒有實現內容拷貝,證實iOS中的深複製只實現了單層複製
完全複製地址不同,說明歸檔解檔方法實現的完全複製其每一層都實現內容拷貝
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
iOS 淺賦值、深複製、完全複製的知識點梳理驗證(附加歸檔解檔)