iOS開發 陣列的深拷貝淺拷貝注意點

2021-07-15 07:06:37 字數 779 閱讀 1343

今天寫**過程中遇到乙個頭疼的問題:可變陣列經過深拷貝之後,變動新陣列裡面的元素,原來的陣列也會跟著變。

做了一下實驗,得到如下結論:

當陣列元素是自定義類的時候,不管深淺拷貝,陣列裡面的元素位址是不變的。

dpntextcontent *content1 = [[dpntextcontent alloc] init];

content1.content = @"1";

dpntextcontent *content2 = [[dpntextcontent alloc] init];

content1.content = @"2";

dpntextcontent *content3 = [[dpntextcontent alloc] init];

content1.content = @"3";

nsmutablearray *arr1 = [nsmutablearray arraywithobjects:content1,content2,content3, nil];

nsmutablearray *arr2 = [nsmutablearray arraywitharray:arr1];

dpntextcontent *ccc = [arr2 lastobject];

ccc.content = @"999";

nslog(@"%@,%@",arr1,arr2);

這個在程式設計中得小心了。最後以元素替換的方式達到了目的。

附上乙個關於講解深淺拷貝的文章,特別詳盡:

陣列拷貝(深拷貝 淺拷貝)

底層都是使用system.arraycopy object src,int srcpos,object dest,int destpos,int length 方法完成陣列元素拷貝任務的 方法說明 如果newlength original.length,那麼會將原陣列中前newlength個元素拷貝...

iOS偽拷貝, 淺拷貝, 深拷貝

先來說說偽拷貝。偽拷貝就是生成了乙個指標變數,指向了某乙個物件。接下來我們來 下淺拷貝和深拷貝。首先,從copy開始說,簡而言之,copy的目的就是生成乙個新的例項,然後把其成員都按原例項賦值。對於非指標型的成員,比如bool,int,float,這樣的賦值可以直接進行。但是對於指標型的資料,比如o...

IOS開發中深拷貝與淺拷貝

簡而言之 1 對不可變的非集合物件,copy是指標拷貝,mutablecopy是內容拷貝 2 對於可變的非集合物件,copy,mutablecopy都是內容拷貝 3 對不可變的陣列 字典 集合等集合類物件,copy是指標拷貝,mutablecopy是內容拷貝 4 對於可變的陣列 字典 集合等集合類物...