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開發中的深複製是單層深賦值,本文將對這幾個概念進行驗證梳理。 (單
Day40、this指標和常函式、解構函式、物件的建立和銷燬過程、拷貝構造和拷貝賦值(深拷貝、淺拷貝!)
一、 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模組來複制物件.