在討論深淺拷貝之前,先明確一下它們的含義
對於strong修飾的物件,都是淺拷貝,僅拷貝物件的位址,使得物件的引用計數加1 ,而copy和mutablecopy主要分為集合類物件和非集合類物件來討論,先給一張圖。mutable:可變 immutable:不可變
上圖總結如下:
對於集合類物件,在深拷貝時即內容拷貝,拷貝的只是集合類的物件,對於其內部的元素依然是淺拷貝即指標拷貝
如何實現集合類物件深拷貝時,對其內部元素也實現深拷貝,方法如下:
nsarray *array = [[nsarray alloc] initwitharray:otherarray copyitems:yes];
將copyitems:設定為yes即可實現內部元素的深拷貝,設定後集合中的每個物件都會收到copywithzone:方法,如果物件遵循了nscoping協議,集合中內部的物件就會被深拷貝到新的集合中;如果物件沒有遵循這個協議,在複製時就會報錯。
copywithzone:
只能夠提供一層記憶體拷貝,而不是真正的深拷貝
nsarray *array =[nskeyedunarchiver unarchiveobjectwithdata:[nskeyedarchiver archiveddatawithrootobject:otherarray]];
為什麼在宣告不可變物件屬性時用copy
為了保證當前屬性物件不受外界影響
使用copy無論傳的是可變還是不可變的物件
返回的都是乙個不可變的物件,確保當前屬性不會無意間變化
copy用來修飾不可變物件,以保護物件的封裝性
參考文章1
參考文章2
深入物件的copy和mutableCopy
深入理解copy和mutablecopy必須要先理解堆 heap 和棧 stack 的區別,以下鏈結來自stack overflow的詳細解答。簡要的一句話就是 物件儲存在堆中,該物件在堆中便有了乙個記憶體位址,該位址屬於棧中的乙個變數 指標 這個變數在棧中也占有一段記憶體。對於不可變物件copy是...
copy模組中的copy與deepcopy的區別
每空閒下來,就覺得以前寫的部落格很low.也許現在也很low 好吧就當公升級版的low吧 如果要了解copy與deepcopy的區別,就需要了解python的儲存機制 python在賦值會在記憶體裡開闢乙個空間來存放值這就叫 記憶體位址 同時會開闢乙個空間來存放名字叫命名,在資料相同長度在一定範圍 ...
關於python深copy與淺copy的一點理解
一直對python深copy和淺copy似懂非懂的狀態,看了這篇文章,覺得自己懂了很多,給各位參考!出處 import copy a 1 不可變資料型別 copy a copy.copy a print id a id copy a 記憶體位址相同 a 1,2 可變資料型別 copy a copy....