copy和mutableCopy

拷貝:賦值一個對象會變成另外一個對象。

深拷貝:複製對象,並且複製對象裏面的內容,完全拷貝。
淺拷貝:指針拷貝,只拷貝對象,不拷貝對象裏面的內容。

判斷是不是深拷貝,主要是看是不是拷貝了裏面的內容。

copy
mutableCopy 系統自帶的都屬於淺拷貝

實現深拷貝的方法
1、可以自定義拷貝(根據具體拷貝內容的實現)
2、系統提供給了深拷貝的構造方法
(1)數組 -( instancetype)initWithArray:(NSArray<ObjectType>)array  copyItems:(BOOL)flag
  (2)字典 -( instancetype)initWithDictionary:(NSDictionary<KeyType,ObjectType>)otherDictionary copyItems:(BOOL)flag

自定義拷貝
1、copyWithZone:
2、mutableCopyWithZone

並不是所有的類型都可以copy,如果想讓不可以拷貝的實現拷貝,則需自定義
可以拷貝的數據類型:字符串、字典、數組
並不是所有的對象都可以拷貝,只有遵守拷貝協議的的對象纔可以拷貝
拷貝協議<NSCopying,NSMutableCopying>

創建一個以NSObject爲父類的類,在這個類裏面創建自定義拷貝
在.h文件中導入拷貝協議
聲明要拷貝對象的屬性@property(nonatomic,retain)NSMutableArray *list;//如果想讓list成爲一個可變的數組,需要將copy變成retain,因爲copy之後的對象永遠是一個不可變的對象。
在.m文件中實現自定義拷貝的方法
-(id)copyWithZone:(nullable NSZone *)zone{
創建一個拷貝對象
XX *xx = [[XX allocWithZone:zone]init];
xx.屬性 = [self.屬性 copy];
return xx;
}
//allocWithZone在執行copy的時候分配內存 new是拷貝之後的對象

-(id)mutableCopyWithZone:(nullable NSZone *)zone{
創建一個拷貝對象
XX *xx = [[XX allocWithZone:zone]init];
xx.屬性 = [self.屬性 mutableCopy];
return xx;
}

mutableCopy是深拷貝還是淺拷貝
指針拷貝是淺拷貝
對象拷貝是深拷貝
mutableCopy->深拷貝 在使用mutableCopy拷貝後,兩個對象的內存地址不一樣
mutableCopy->淺拷貝 拷貝對象的內容的內存地址是否發生改變

copy 拷貝後的對象是不可變的對象
mutableCopy 拷貝後的對象是可變的,必須要有可變的對象去接收
想要把考被後的對象變成可變的,必須用可變的數據類型去接受。

不可變對象copy—>生成不可變的對象—>不管用可變或者不可變類型接收,都是不可變。
可變的對象copy—>生成不可變的對象—>不管用可變或者不可變類型接收,都是不可變。

不可變對象mutable—>可變的對象—>不可變對象接收—>不可變對象
不可變對象mutable—>可變的對象—>可變對象接收—>可變對象
可變對象mutable—>可變的對象—>不可變對象接收—>不可變對象
可變對象mutable—>可變的對象—>可變對象接收—>可變對象

只要使用copy就是不可變
使用mutable必須使用可變的類型接收纔是可變對象

重點:1、分清copy和mutableCopy
           2、記住深淺拷貝的含義、區別
發佈了37 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章