1. 程式人生 > >iOS 淺賦值、深複製、完全複製的知識點梳理驗證(附加歸檔解檔)

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 複製完全複製知識點梳理驗證(附加歸檔)

寫於前: 在之前轉載的一片文章中,文中對淺複製和深複製進行了詳細的解讀,同時還提到了深複製(one-level-deep copy)、完全複製(true copy)的概念,並指出iOS開發中的深複製是單層深賦值,本文將對這幾個概念進行驗證梳理。 (單

Day40this指標和常函式構函式物件的建立和銷燬過程拷貝構造和拷貝拷貝拷貝!)

一、            this和常函式 1、 this 指標 1)     類中的建構函式和成員函式都隱藏一個該類型別的指標引數,引數名為this。 2)     對於普通的成員函式,this指標就是指向呼叫該函式的物件 3)     對於建構函式,this指標指向正

python按引用拷貝

按引用賦值而不是拷貝副本 在python中,無論是直接的變數賦值,還是引數傳遞,都是按照引用進行賦值的。 在計算機語言中,有兩種賦值方式:按引用賦值、按值賦值。其中按引用賦值也常稱為按指標傳值(當然,它們還是有點區別的),後者常稱為拷貝副本傳值。它們的區別,詳細內容參見:按值傳遞 vs. 按指標傳遞。

拷貝拷貝

一、淺拷貝     物件初始化物件的時候調動拷貝建構函式,只是拷貝指標指向的拷貝構造稱為淺拷貝。       當要析勾的時候物件被一一析勾的時候,第二個析勾的物件就找不到需要釋放的空間,程式報錯。

筆記十:複製建構函式拷貝拷貝

複製建構函式 定義: 只有單個形參,而且該形參是對本類型別物件的引用(常用const修飾),這樣的建構函式成為複製建構函式。複製建構函式可用於: 1、根據另一個同類型的物件顯示或隱式初始化一個物件 2、複製一個物件,將它作為實參傳遞給一

Python的拷貝和拷貝的區別

在python中,物件賦值實際上是物件的引用。當建立一個物件,然後把它賦給另一個變數的時候,python並沒有拷貝這個物件,而只是拷貝了這個物件的引用 一般有三種方法, alist=[1,2,3,["a","b"]]   (1)直接賦值,傳遞物件的引用而已,原始列表改變,被

javascript---物件和函式的引用拷貝拷貝遞迴

1、javascript 對象和函式的引用 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>javascript 物

Object的clone()方法拷貝拷貝

         一個物件直接使用=,比如Object o1=new Object(); Object o2=o1;那麼問題是o1改變,o2也會改變。 這時候,需要不隨之前的物件改變而改變,使用clone。 需要注意clone是protect的,所以子類繼承Object

[瘋狂Java]基礎類庫:Object拷貝Objects工具類

1. Object類簡介:     1) 是Java所有型別的基類,如果一個自定義的類沒有extends顯示指定其父類則它預設繼承Object類;     2) 常用方法(通常需要根據需求覆蓋,Object本身對它們的定義極其簡單):          i. 相等判斷:

python_cookbook之路:數據結構-壓可叠代對象給多個變量以及擴展的叠代壓語法(*)

rec 3.4 open pan spl python res cor coo 1.一一對應: >>> data = [ ‘ACME‘, 50, 91.1, (2012, 12, 21) ] >>> name, shares, pri

ios 歸檔

forkey parameter gen ati nor tostring value found utc .h文件 #import <Foundation/Foundation.h> typedef void(^myBlock)(NSData *); t

ios 物件歸檔 runtime實現

什麼是歸檔?什麼是解檔? 歸檔:就是把物件序列化,序列化就是把物件寫到一個指定的app路徑下的檔案裡,app有三個目錄分別是:docments、library、tmp,也叫做物件的持久化,ios開發中一般的持久化不支援自定義物件的持久化,歸檔解檔就可以完成自定

python中的物件(等號複製複製)

程式碼: import copy class Obj(): def __init__(self,arg): self.x=arg if __name__ == '__main__': obj1=Obj(1) obj2=Obj(2)

Python中的複製複製(等號copy和deepcopy的區別)

(作者:陳玓玏) 不是那麼有耐心的朋友可以直接看總結! 一、深複製淺複製的區別 以我比較愚笨的理解,淺複製就是,僅複製物件的引用,而不新開闢記憶體,也就是說,會共享指標,當你改變複製後的物件時,其實是在改變原物件記憶體中的內容。 而深複製的意思是,會

拷貝以及拷貝的區別

fff 情況 spa clas nbsp tro 淺拷貝 pen pan 字符串賦值 >>> >>> str1 = ‘standby‘ >>> >>> str2 = str1 &g

Python拷貝拷貝的區別

ID IV 元素 改變 拷貝 但是 int 需要 copy 一、賦值 str例子 >>> a = 'hello' >>> b = 'hello' >>> c = a >>&

python 字典拷貝拷貝

# 專案開發中,因字典可修改,所以注意拷貝方式 import copy   1. 原字典操作 dict1 = {'user': 'test', 'num': [1, 2, 3]}              &

Python——拷貝和拷貝

賦值 我們先定義一個變數a,然後指向數值為100的這個空間,然後建立的變數b和a指向了同一個空間地址。 物件之間的賦值本質就是引用的傳遞。 那麼思考一下,在針對操作可變變數資料的時候,修改了a的值之後b的變化是否會發生變化? 答案自然會是肯定的,因為賦值的本質只是引用的傳遞,只要傳

Python中拷貝與拷貝的區別

賦值,其實就是物件的引用,對新物件的如何修改都會影響到原始物件。 Python中有兩種拷貝操作:淺拷貝和深拷貝。 copy.copy(x):返回x的淺拷貝。 copy.deepcopy(x):返回x的深拷貝。 那麼都是拷貝,淺拷貝和深拷貝有什麼不同嗎? 淺

python直接拷貝和拷貝

python中,物件賦值實際上是物件的引用。當建立一個物件,將其賦值給另一個變數,python並沒有拷貝這個物件,而是拷貝了這個物件的引用。 所以如果從單純的賦值語句來實現clone物件的話, 那可能bug出現的也會莫名其妙. Python中可以使用copy模組來複制物件.