區別點:
深拷貝會創建壹個新的內存空間,拷貝的值是壹樣的,但是內存地址不壹樣。
淺拷貝只是拷貝指向原來對象的地址,使原對象的引用計數+1
像NSString、NSNumber這些不能包含其他對象的叫做非容器類對象
像NSArray、NSDictionary這些可以包含其他對象的叫容器類對象
打印結果如下:
通過對比不難發現:
上面我們使用的是不可變的NSString,下面我們再使用可變的NSMutableString對比壹下:
打印結果如下:
不難發現,對於NSMutableString, 無論是copy還是mutableCopy都會創建壹個新對象,屬於深拷貝
打印結果如下:
不難發現,copy是淺拷貝,mutableCopy是深拷貝,不過需要註意的是容器對象的成員元素都指向相同的地址
打印結果如下:
對比可見,容器對象與非容器對象類似,可變對象的復制都是深拷貝,不可變對象copy是淺拷貝,mutableCopy是深拷貝
需要註意的是對容器而言,元素對象始終是指針復制
正如前面所說,容器對象中的元素對象無論是copy還是mutableCopy都是指針復制,如何實現容器對象的完全深拷貝呢?
系統為我們實現容器對象的完全深拷貝提供了方法