先上代碼github,如有錯(cuò)誤請(qǐng)幫忙指出,謝謝!轉(zhuǎn)載請(qǐng)注明出處,喜歡的話,請(qǐng)點(diǎn)個(gè)贊吧!
一、概念
1、淺拷貝 = 指針拷貝:多了一個(gè)指針,指向同一塊內(nèi)存地址(同一個(gè)對(duì)象)。
2、深拷貝 = 內(nèi)容拷貝:多了一個(gè)指針,指向不同的內(nèi)存地址(不同的對(duì)象)。
二、總結(jié)
1、對(duì)于不可變的非集合類的對(duì)象,copy是淺拷貝,mutableCopy是深拷貝。
2、對(duì)于可變的非集合類的對(duì)象,copy和mutableCopy都是深拷貝。
3、對(duì)于不可變的數(shù)組,字典等集合類的對(duì)象,copy是淺拷貝,mutableCopy是深拷貝。
4、對(duì)于可變的數(shù)組,字典等集合類的對(duì)象,copy和mutableCopy都是深拷貝。
注:集合類的對(duì)象深拷貝拷貝的是本身對(duì)象,不包含里面的元素等對(duì)象,可以實(shí)現(xiàn)完全深拷貝整個(gè)集合對(duì)象請(qǐng)看下面代碼解釋
三、代碼解釋
1、不可變的非集合類對(duì)象

image.png
2、可變的非集合類對(duì)象

image.png
3、不可變的集合類對(duì)象

image.png
4、可變的集合類對(duì)象

image.png
5、集合類對(duì)象的object的拷貝情況
注:集合類對(duì)象要實(shí)現(xiàn)對(duì)象里面的object也拷貝需要執(zhí)行如下方法
1、- (instancetype)initWithArray:(NSArray<ObjectType> *)array copyItems:(BOOL)flag;
/// 還有更多的歸檔解檔擴(kuò)展方法,具體請(qǐng)自行了解NSKeyedUnarchiver
2、+ (nullable id)unarchivedObjectOfClass:(Class)cls fromData:(NSData *)data error:(NSError **)error
從下圖可以得出結(jié)論,不支持NSCopying,NSMutableCopying協(xié)議的例如NSString,NSNumber拷貝后object的地址還是一致,沒有真正的復(fù)制一個(gè)出來,不過支持NSCopying,NSCoding的協(xié)議的object都能進(jìn)行真正的深拷貝。
image.png

image.png

image.png