關於深拷貝和淺拷貝

2021-07-24 21:14:35 字數 1416 閱讀 8449

以nsstring與nsmutablestring舉例

nsstring *str1 = @"xfj";

nsmutablestring *str2 = [str1 mutablecopy];

nslog(@"%@ %@",str1,str2);

nslog(@"%p %p",str1,str2);

輸出結果:

xfj xfj123

0x102701068 0x600000263b40

會生成乙個新的物件

-nsmutablestring 拷貝 nsmutablestring

nsmutablestring *str1 = [nsmutablestring stringwithformat:@"xfj"];

nsmutablestring *str2 = [str1 mutablecopy];

nslog(@"%@ %@",str1,str2);

nslog(@"%p %p",str1,str2);

輸出結果:

xfj xfj123

0x60800007f400 0x60800007f500

會生成乙個新的物件

-nsstring 拷貝 nsmutablestring

nsmutablestring *str1 = [nsmutablestring stringwithformat:@"xfj"];

nsstring *str2 = [str1 copy];

nslog(@"%@ %@",str1,str2);

nslog(@"%p %p",str1,str2);

輸出結果:

xfj123 xfj

0x600000076900 0xa000000006a66783

會生成乙個新的物件

-nsstring 拷貝 nsstring

nsstring *str1 = @"xfj";

nsstring *str2 = [str1 copy];

nslog(@"%@ %@",str1,str2);

nslog(@"%p %p",str1,str2);

輸出結果:

xfj xfj

0x102047068 0x102047068

不會生成乙個新的物件

可見oc為了對記憶體進行優化

當乙個不可變的物件copy另乙個不可變的物件時 並不會生成乙個新的物件 兩個物件都不能修改 那麼就沒有必要生成乙個新的物件 淺拷貝 本質就是指標的copy

如果copy生成了乙個新的物件 就是深拷貝 本質就是建立了乙個新的物件

C 關於深拷貝和淺拷貝

在c 中,資料型別有值型別和引用型別 值型別包括 結構體 數值型別,bool型,使用者定義的結構體 列舉,可空型別。引用型別包括 陣列,使用者定義的類 介面 委託,object,字串。對於值型別的,拷貝是全拷貝,則是拷貝出另乙個物件,兩個物件的記憶體位址是不同的,乙個物件的屬性修改後不影響另乙個物件...

深拷貝和淺拷貝

淺拷貝就是物件的資料成員之間的簡單賦值,如你設計了乙個沒有類而沒有提供它的複製建構函式,當用該類的乙個物件去給令乙個物件賦值時所執行的過程就是淺拷貝,如 class a a private int data int main 這一句b a 就是淺拷貝,執行完這句後b.data 5 如果物件中沒有其他...

淺拷貝和深拷貝

以下情況都會呼叫拷貝建構函式 乙個物件以值傳遞的方式傳入函式體 例如 已知class a,class b void func a a void func a a func b b 此時函式對b的操作是呼叫拷貝建構函式後的臨時拷貝物件。多數傳指標 乙個物件以值傳遞的方式從函式返回 如 return b...