標籤:
深淺拷貝的基本概念和用法
基本概念
淺拷貝紙複製對象的本身,對象裡的屬性、包含的對象不做複製
深拷貝則既複製對象本身,對象的屬性也會複製一份。
Foundation 架構中支援複製的類,預設是淺拷貝。
copy和mutabelCopy
- 一個對象使用copy和mutabelCopy方法可以建立對象的副本
- copy - 需要先實現NSCoppying協議,建立的是不可變副本(如NSString、NSArray、NSDictionary)
- mutabelCopy - 需要先實現NSMutabelCopying協議,建立的是可變副本,(如NSMutabelString、NSMutabelArray、NSMutabelDictionary)
- 深複製:內容拷貝,來源物件和副本指向的是不同的兩個對象。來源物件引用計數器不變,副本計數器設定為1
- 淺複製:指標拷貝,來源物件和副本指向的是同一個對象。對象的引用計數器+1,其實相當於做了一次retain操作
- 只有不可變對象建立不可變副本(copy)才是淺複製,其他都是深複製
舉例:對象的自訂拷貝
對象擁有複製特性,須實現NSCopying、NSMutabelCopying協議,實現該協議的copyWithZone:方法和mutabelCopyWithZone:方法
代碼:
深淺拷貝的不同實現;程式碼範例
Objective - C 對象的深淺拷貝的區別就在於你對copyWithZone的不同實現
深淺拷貝和 retain之間的總結
copy、mutabelCopy 和 retain 之間的關係
- Foundation 可複製的對象,當我們copy的是一個不可變的對象時,他的作用相當於retain (cocoa做得記憶體最佳化)
- 當我們使用mutabelCopy 時 ,無論來源物件師傅可變,副本是可變的,並且實現了真正意義上得拷貝
- 當我們copy 的是一個可變對象時,副本對象是不可變的,同樣實現了真正意義上的拷貝
Foundation 的一些常見複製的案例
IOS開發之深拷貝與淺拷貝(mutableCopy與Copy)詳解