iOS 淺賦值、深複製、完全複製的知識點梳理驗證(附加歸檔解檔)

來源:互聯網
上載者:User

標籤: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 淺賦值、深複製、完全複製的知識點梳理驗證(附加歸檔解檔)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.