IOS 深入理解 深拷貝 與 淺拷貝

2021-08-16 06:29:31 字數 3053 閱讀 6825

oc 陣列中的深拷貝與淺拷貝

dog * dog1 = [dog new];

// 這裡就是淺拷貝,即指標拷貝

dog * dog2 = dog1;

dog.h

@inte***ce dog : nsobject@property (nonatomic) nsinteger age;

@end

dog.m

@implementation dog

- (id)copywithzone:(nszone *)zone

- (id)mutablecopywithzone:(nszone *)zone

- (nsstring *) description

@end

main.m

dog * dog1 = [dog new];

dog1.age = 5;

nslog(@"dog1: %p, %@", dog1, dog1);

// mutablecopy 返回的是可變物件,自然可以設定物件的屬性值

dog * dog2 = [dog1 mutablecopy];

dog2.age = 10;

// copy 返回的物件也可以設定物件的屬性值

// 所以,從這裡來看,其實自定義實現的 copy 和 mutablecopy 功能是一致的,都是返回可變物件的

dog * dog2 = [dog1 copy];

dog2.age = 10;

nslog(@"dog2: %p, %@", dog2, dog2);

oc 可變陣列中的深拷貝與淺拷貝

「陣列中只是儲存了物件的位址,而非儲存了物件的本體。」

nsmutablearray * arr1 = [nsmutablearray new];

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

nslog(@"arr1: %p, %@", arr1, arr1);

nsmutablearray * arr2 = [arr1 mutablecopy];

nslog(@"arr2: %p, %@", arr2, arr2);

執行結果:

2017-010-10 10:55:39.895 深拷貝與淺拷貝[901:303] arr1: 0x1001089c0, (

"","",

"")2017-10-10 10:55:39.917 深拷貝與淺拷貝[901:303] arr2: 0x100301ad0, (

"","",

"")

nsmutablearray * arr2 = [nsmutablearray new];

for (int i = 0; i < arr1.count; i++)

nslog(@"arr2: %p, %@", arr2, arr2);

copy 返回乙個不可變物件的副本,mutalbecopy返回乙個可變物件的副本。

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

nsmutablearray *array1=[array copy];

[array1 addobject:@"three"]; //error

nsmutablearray *array2=[array mutablecopy];

[array2 addobject:@"three"]; //right

// insert code here...

nslog(@"hello, world!");

比較與區別

複製物件的基本概念:複製乙個物件為副本,開闢一塊新的記憶體來儲存副本物件。

如果乙個物件想具備複製的功能,必須實現協議和協議

nsobject自帶的常用的物件有:nsnumber、nsstring、nsarray、nsdictionary、nsmutablearray、nsmutabledictionay、nsmutablestring,copy產生的物件時不可變的,mutablecopy產生的物件時可變的

copy和mutablecopy的區別

copy 返回乙個不可變物件的副本,mutalbecopy返回乙個可變物件的副本。

淺copy和深copy

淺複製盡複製物件本身,物件裡的屬性、包含的物件不做複製。

淺複製只是複製指標,並沒有建立新的記憶體空間。

深複製複製全部,包括物件的屬性和其他物件

foundation框架支援複製的類,預設是淺複製

物件的自定義拷貝

物件擁有複製特性,必須實現nscopying,nsmutablecopying協議,實現該協議的copywithzone方法和mutablecopywithzone方法

深拷貝和淺拷貝的區別就在於copywithzone方法的實現,

copy、mutablecopy和retain之間的關係

在foundation物件中,copy是乙個不可變的物件時,作用相當於retain

當使用mutablecopy時,不管源物件是否可變,副本是可變的,並且實現真正意義上的copy

當我們使用copy乙個可變物件時,副本物件是不可變的。

nsfoundation,當我們copy的時乙個不可變物件時,預設的copy都是淺拷貝,相當於retain

當使用mutablecopy時,不管物件是否可變,都會實現深拷貝

retain相當於兩個物件指向同乙個指標

總結:copy與mutablecopy:

copy:對於可變物件為深拷貝,對於不可變物件是淺拷貝。返回物件是否可變與被複製的物件保持一致。

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

深入理解深拷貝與淺拷貝

深拷貝和淺拷貝是經常在面試中會出現的,主要考察你對基本型別和引用型別的理解深度。我在無數次的面試中,應聘者還沒有乙個人能把這個問題回答情況,包括很多機構的培訓老師。這篇文章會讓你把基本型別和引用型別的區別搞得清清楚楚,搞清楚這兩者的區別,你對任何程式語言的都不怕,因為,這不是js一門語言,是任何程式...

js中的淺拷貝深拷貝深入理解

舉個例子來說明一下什麼是淺拷貝什麼是深拷貝 var x c 1,2,3 var y shallow x 得出的結果可以看出是淺拷貝 出現這種情況的本質是 物件是按引用賦值的 指的是拷貝乙個物件,改變乙個值不影響另乙個的值 實現深複製功能 判斷 1.是否是物件 2.是否是函式 function dee...

iOS深拷貝與淺拷貝

在大部分的程式語言中,都有深拷貝與淺拷貝的概念,如果使用深淺拷貝有誤,可能會造成資料安全性的問題,那麼本節針對oc中的深淺拷貝展開討論 深拷貝與淺拷貝的概念 我們在進行例項物件操作時,無非是兩種例項方式 建立新物件後將原物件的內容拷貝乙份,而後返回該物件引用 深淺拷貝的區別由此產生 以下是b物件拷貝...