12 深淺拷貝

2021-07-04 06:39:09 字數 1761 閱讀 2935

複製物件的基本概念:複製乙個物件作為副本,它會開闢一塊新的記憶體(堆記憶體)來儲存副本物件,就像複製檔案一樣.即源物件和副本物件是兩塊不同的記憶體區域.

物件具備複製功能,必須實現協議,協議.常用的可複製物件有:nsnumber,nsstring,nsarray,nsdictionary.nsmutabledictionary,nsmutablearray,nsmutablrstring;

複製物件的種類: 1)copy:產生物件的副本是不可變的 2)mutablecopy:產生的副本物件是可變的

淺複製只複製物件的本身,物件裡的屬性和包含的物件不做複製.

淺複製則既複製物件本身,物件的屬性也會複製乙份foundation框架中支援的複製的類,預設是淺複製

//兩陣列指向同一位址

nsmutablearray *array1 = [[nsmutablearray alloc] initwithobjects:@"one",@"two",@"three",@"foure", nil];

nsmutablearray *array2 = [array1 retain];

[array2 removelastobject];

nslog(@"%@",array1);//--->(one,two,three)

nslog(@"%ld",array1.retaincount);//--->2

//兩陣列非同一位址

nsmutablearray *array1 = [[nsmutablearray alloc] initwithobjects:@"one",@"two",@"three",@"foure", nil];

nsmutablearray *array2 = [array1 mutablecopy];

[array2 removelastobject];

nslog(@"%@",array1);//--->(one,two,three,foure)

nsarray *array = @[@"one",@"two"];

//array1和array指向同一位址,copy出來的物件是不可變的

nsarray *array1 = [array copy];//不可變陣列不能新增元素

nsmutablearray *array2 = [array mutablecopy];

[array2 addobject:@"three"];

nslog(@"%@",array2);//--->(one,two,three)

例如:乙個陣列包含了許多個物件,複製乙個陣列的副本,那麼兩個陣列中的元素是沒有複製的,指向的還是同乙個物件

nsmutablearray *array = [nsmutablearray array];

for (int i=0; i<3; i++)

for (nsobject *obj in array)

@end

:即copy,mutablecopy和retain之間的關係

1) foundation可複製的物件,當我們copy是是乙個不可變的物件是,它的作用相當於retain(cocoa做的記憶體優化)

2) 當我們使用mutablecopy時,無論源物件是否可變,副本是可變的,並且實現的了真正意義上的拷貝

3) 當我們copy的是乙個可變的物件時,副本物件是不可變的,同樣實現了真正意義上的拷貝

nsinteger 是在棧區的,效率高,速度快,可以放在方法內部使用 , nsnumber是物件,在堆中的,自帶了數值轉換功能,效率差一些,方便kvc賦值

深淺拷貝以及深淺拷貝的方法

先考慮一種情況,對乙個已知物件進行拷貝,編譯系統會自動呼叫一種建構函式 拷貝建構函式,如果使用者未定義拷貝建構函式,則會呼叫預設拷貝建構函式。執行結果 呼叫一次建構函式,呼叫兩次析構函式,兩個物件的指標成員所指記憶體相同,name指標被分配一次記憶體,但是程式結束時該記憶體卻被釋放了兩次,會造成記憶...

拷貝和深淺拷貝

當list2為list的拷貝物件時,list內的可變資料型別變化,list2變化 list內的不可變資料型別變化,list2變化。總之 list變化list2一定變化 list 1,2,3,4,list2 list print list print list2 1,2,3,4,5 1,2,3,4,5...

python 深淺拷貝

建立乙個寬度為3,高度為4的陣列 mylist 0 3 4 0,0,0 0,0,0 0,0,0 0,0,0 但是當操作mylist 0 1 1時,發現整個第二列都被賦值,變成 0,1,0 0,1,0 0,1,0 0,1,0 list n n shallow copies of list concat...