深拷貝和淺拷貝的區別

2021-07-09 02:30:41 字數 1661 閱讀 6612

一.深拷貝

源物件和副本物件是不同的兩個物件

源物件引用計數不變,副本物件計數器為1(因為是新產生的)

至少有一層是物件複製

二.淺拷貝

源物件和副本物件是同乙個物件

源物件(副本物件)引用計數器+1,相當於做一次retain操作

本質:沒有產生新的物件

三.完全複製

對於被複製的物件每一層都是物件複製

四.哪些是深拷貝,哪些是淺拷貝

retain:始終是淺複製;返回物件是否可變與被複製的物件保持一致

copy:對於可變物件是深拷貝,返回乙個不可變物件

對於不可變物件為淺拷貝,返回乙個不可變物件

mutablecopy:始終是深拷貝,始終返回乙個可變物件

五:例子

1.nsstring中為什麼用copy

1)宣告2個字串屬性,乙個為strong,乙個為copy

@inte***ce teststring : nsobject

@property (nonatomic, strong) nsstring *strongstring;

@property (nonatomic, copy) nsstring *copyedstring;

@end

2)用乙個不可變字串來為這兩個屬性賦值

-(void)test

3)輸出結果

2015-12-21 14:56:09.335 使用copy[927:68174] strm:0x100004260

2015-12-21 14:56:09.336 使用copy[927:68174] strongstring:0x100004260

2015-12-21 14:56:09.336 使用copy[927:68174] copyedstring:0x100004260

結論:不管是strong還是copy屬性的物件,其指向的位址都是同乙個,為string指向的位址。如果我們換作mrc環境,列印string的引用計數的話,會看到其引用計數值是3,即strong操作和copy操作都使原字串物件的引用計數值加了1。

4)將nsstring改為nsmutablestring

-(void)test

5)列印結果

2015-12-21 14:49:10.860 使用copy[907:65503] strm:0x100206ed0

2015-12-21 14:49:10.861 使用copy[907:65503] strongstring:0x100206ed0

2015-12-21 14:49:10.861 使用copy[907:65503] copyedstring:0x100207020

結論:此時copy屬性字串已不再指向string字串物件,而是深拷貝了string字串,並讓_copyedstring物件指向這個字串。在mrc環境下,列印兩者的引用計數,可以看到string物件的引用計數是2,而_copyedstring物件的引用計數是1。

最後:一般我們將物件宣告為nsstring型別時,都不希望它改變,所以大多數情況下,使用copy,以免因可變字串的修改導致一些非預期問題

深拷貝和淺拷貝的區別

retain屬性表示兩個物件位址相同 建立乙個指標,指標拷貝 內容當然相同,這個物件的retain值 1也就是說,retain 是指標拷貝 淺拷貝 copy 是內容拷貝 深拷貝 ios中並不是所有的物件都支援copy,mutablecopy,遵守nscopying 協議的類可以傳送copy訊息,遵守...

深拷貝和淺拷貝的區別

深淺拷貝的區別 淺拷貝是將原始物件中的資料型字段拷貝到新物件中去,將引用型字段的 引用 複製到新物件中去,不把 引用的物件 複製進去,所以原始物件和新物件引用同一物件,新物件中的引用型字段發生變化會導致原始物件中的對應欄位也發生變化。深拷貝是在引用方面不同,深拷貝就是建立乙個新的和原始欄位的內容相同...

深拷貝和淺拷貝的區別

淺拷貝,即在定義乙個類 a,使用類似 a obj a obj1 obj 或者a obj1 obj 時候,由於沒有自定義拷貝建構函式,c 編譯器自動會產生乙個預設的拷貝建構函式。這個預設的拷貝建構函式採用的是 位拷貝 淺拷貝 而非 值拷貝 深拷貝 的方式,如果類中含有指標變數,預設的拷貝建構函式必定出...