一困肩、深拷貝划纽,淺拷貝
對象拷貝有兩種方式:淺復(fù)制和深復(fù)制。顧名思義僻弹,淺復(fù)制阿浓,并不拷貝對象本身他嚷,僅僅是拷貝指向?qū)ο蟮闹羔槪?深復(fù)制是除了拷貝指向?qū)ο蟮闹羔樚U溃抑苯涌截愓麄€對象內(nèi)存到另一塊內(nèi)存中。
再簡單些說:淺復(fù)制就是指針拷貝筋蓖;深復(fù)制就是內(nèi)容拷貝卸耘。
淺copy: 指針復(fù)制,不會創(chuàng)建一個新的對象粘咖。深copy: 內(nèi)容復(fù)制蚣抗,會創(chuàng)建一個新的對象。
二瓮下、非集合類的對象 shallow copy 和 deep copy
在非集合類對象中:
對immutable對象進(jìn)行copy操作翰铡,是指針復(fù)制,mutableCopy操作時內(nèi)容復(fù)制讽坏;
對mutable對象進(jìn)行copy和mutableCopy都是內(nèi)容復(fù)制锭魔。
用代碼簡單表示如下:
[immutableObject copy] // 淺復(fù)制 + 不可變對象
[immutableObject mutableCopy] //深復(fù)制 + 可變對象
[mutableObject copy] //深復(fù)制 + 不可變對象
[mutableObject mutableCopy] //深復(fù)制 + 可變對象
三、集合類的對象自身的 shallow copy 和 deep copy
在集合類對象中路呜,對immutable對象進(jìn)行copy迷捧,是指針復(fù)制织咧,mutableCopy是內(nèi)容復(fù)制;
對mutable對象進(jìn)行copy和mutableCopy都是內(nèi)容復(fù)制漠秋。
但是:集合對象的內(nèi)容復(fù)制僅限于對象本身笙蒙,對象元素仍然是指針復(fù)制。用代碼簡單表示如下:
[immutableObject copy] // 淺復(fù)制 + 不可變對象[immutableObject mutableCopy] //單層深復(fù)制 + 可變對象[mutableObject copy] //單層深復(fù)制 + 不可變對象[mutableObject mutableCopy] //單層深復(fù)制 + 可變對象
四庆锦、集合類的對象中元素的 one-level-deep copy 捅位、two-level-deep copy 和 real-deep copy
1、集合類的對象中的元素為 Foundation 架構(gòu)下的
1)單層深復(fù)制
對(集合類) 對象自身執(zhí)行深copy搂抒,對 (集合類)對象內(nèi)部的元素 執(zhí)行淺copy绿渣,稱為集合類的單層深復(fù)制。
2)雙層深copy
這里的雙層指的NSArray對象一層 和 NSArray容器內(nèi)對象 的一層
3)完全深復(fù)制 (完美copy)
如果想 完美的解決NSArray嵌套NSArray這種情形燕耿,使用歸檔中符、解檔的方式
2、集合類的對象中的元素為 Custom對象
1)單層深復(fù)制 (demo:OC_Copy3_1)
對比之前的 NSString誉帅,我們需要遵守NSCopying, NSMutableCopying淀散,才可以進(jìn)行copy和mutableCopy 操作集合類對象自身執(zhí)行了深copy,集合類對象中的元素執(zhí)行淺copy
2)雙層深copy (demo:OC_Copy3_2蚜锨,OC_Copy3_3)
這里的雙層指的NSArray對象一層 和 NSArray容器內(nèi)對象 的一層
3)完全深復(fù)制 (完美copy) (demo:OC_Copy3_4)
如果想 完美的解決NSArray嵌套NSArray這種情形档插,使用歸檔、解檔的方式
對于自定義的類亚再,需要遵循NSCoding協(xié)議