OC學習 淺拷貝和深拷貝

2021-07-04 11:30:46 字數 1267 閱讀 9889

淺拷貝和深拷貝區別是什麼?

淺拷貝就是指 指標的賦值 深拷貝就是開闢了乙個新的空間

在有指標的情況下,淺拷貝只是增加了乙個指標指向已經存在的記憶體.

深拷貝就是增加乙個指標並且申請乙個新的記憶體,使這個增加的指標指向這個新的記憶體.

採用深拷貝的情況下,釋放記憶體的時候就不會出現在淺拷貝時重複釋放同一記憶體的錯誤.

person *per1 = [[person alloc]init];

person *per2 = [[person alloc]init];

person *per3 = [[person alloc]init];

nslog(@"%lu %p",[per1 retaincount],per1);

nsarray *arr = [[nsarray alloc]initwithobjects:per1,per2,per3, nil];

nslog(@"arr[0] : %lu %p",[arr[0] retaincount],arr[0]);

//不可變陣列是乙個淺拷貝 相當於retain操作..對陣列元素也是淺拷貝 是簡單的指標賦值 引用計數沒有變化

//對陣列進行copy

nsarray *copyarr = [arr copy];

nslog(@"%p %p",arr,copyarr); //不可變的陣列 是淺拷貝

nslog(@"%lu ",[arr retaincount]);

nslog(@"%lu",[arr[0] retaincount]);

nsmutablearray *muarr = [[nsmutablearray alloc]initwithobjects:per1,per2,per3, nil];

nslog(@"per1 %lu",[per1 retaincount]);

//對於可變陣列 是乙個深拷貝 產生了乙個新的陣列物件 但是對於不可變陣列內的陣列元素是淺拷貝,相當於retain操作..

nsmutablearray *copymuarr = [muarr copy];

nslog(@"%p %p",muarr,copymuarr);

nslog(@"%lu %lu",[muarr retaincount],[copymuarr retaincount]);

nslog(@"%p %lu %p %lu",muarr[0],[muarr[0] retaincount],copymuarr[0],[copymuarr[0] retaincount]);

oc學習之旅 陣列淺拷貝深拷貝

copy nsstring str1 wahaha nsstring str2 str1 copy nsstring str3 str1 retain nslog str1 p str2 p str4 p str1,str2,str3 nsmutablestring str4 nsmutablest...

深拷貝和淺拷貝

淺拷貝就是物件的資料成員之間的簡單賦值,如你設計了乙個沒有類而沒有提供它的複製建構函式,當用該類的乙個物件去給令乙個物件賦值時所執行的過程就是淺拷貝,如 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...