天天看點

OC_對象copy學習筆記

1 對象copy概念

copy的字面意思就是複制  拷貝 是一個産生副本的過程 對象拷貝的目的:要使用某個對象的資料, 但是在修改對象的時候不影響原來對象的内容 特點: 修改源檔案的内容,不會影響副本檔案 修改副本檔案的内容,不會影響源檔案 OC中的copy 就是指的對象的拷貝 如何使用copy的功能: 一個對象可以調用copy或mutableCopy方法來建立一個副本對象 copy : 建立的是不可變副本 (NSString, NSArray, NSDictionary) mutableCopy:建立的是可變副本,(NSMutableString, NSMutableArray, NSMutableDictionary)

使用copy功能的前提: copy: 需要遵守NSCopying協定,實作copyWithZone:方法 mutableCopy: 需要遵守NSMutableCopying協定,實作mutableCopyWithZone:方法

2 初識copy

以NSString字元串為例,進行copy 和 mutableCopy示範 copy就是淺複制,沒有産生新的對象  隻是拷貝位址

OC_對象copy學習筆記

mutableCopy就是深複制,會在記憶體中重新配置設定一塊記憶體空間

OC_對象copy學習筆記

隻要是涉及到可變對象就是深複制

3 copy與記憶體管理 NSString的copy 淺複制,源對象的引用計數器+1

OC_對象copy學習筆記

NSString的mutableCopy 深複制,建立了一個新對象,新對象的引用的引用計數器是1

OC_對象copy學習筆記

總結:  深複制  (深拷貝  内容拷貝 deep copy) 源對象和副本對象是不同的兩個内容 源對象引用計數器不變,副本對象計數器為1 本質是: 産生了新的對象 淺複制  (淺拷貝 指針拷貝 shallow copy) 源對象和副本對象是同一個對象 源對象(副本對象)引用計數器+1 相當于做一次retain操作 本質 :沒有産生新的對象

3  @property中copy的作用

OC_對象copy學習筆記

以上肯定不是我們想要的,因為str修改後,會影響person.name的值 解決辦法: @property(nonatomic, copy) NSString *name;