深入理解object C中複製物件的用法 深淺拷貝

2021-07-26 16:03:37 字數 4971 閱讀 7144

一、複製物件的基本概念

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

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

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

第三、retain和copy的區別

copy與retain的區別:

copy是建立乙個新物件,retain是建立乙個指標,引用物件計數加1。copy屬性表示兩個物件內容相同,新的物件retain為1 ,與舊有物件的引用計數無關,舊有物件沒有變化。copy減少物件對上下文的依賴。

retain屬性表示兩個物件位址相同(建立乙個指標,指標拷貝),內容當然相同,這個物件的retain值+1也就是說,retain 是指標拷貝,copy 是內容拷貝。

當然在ios中並不是所有的物件都支援copy,mutablecopy,遵守nscopying 協議的類可以傳送copy訊息,遵守nsmutablecopying 協議的類才可以傳送mutablecopy訊息。假如傳送了乙個沒有遵守上訴兩協議而傳送 copy或者 mutablecopy,那麼就會發生異常。但是預設的ios類並沒有遵守這兩個協議。如果想自定義一下copy 那麼就必須遵守nscopying,並且實現 copywithzone: 方法,如果想自定義一下mutablecopy 那麼就必須遵守nsmutablecopying,並且實現 mutablecopywithzone: 方法。copy是建立乙個新物件,retain是建立乙個指標,引用物件計數加1。copy屬性表示兩個物件內容相同,新的物件retain為1 ,與舊有物件的引用計數無關,舊有物件沒有變化。copy減少物件對上下文的依賴。

retain屬性表示兩個物件位址相同(建立乙個指標,指標拷貝),內容當然相同,這個物件的retain值+1也就是說,retain 是指標拷貝,copy 是內容拷貝。

當然在ios中並不是所有的物件都支援copy,mutablecopy,遵守nscopying 協議的類可以傳送copy訊息,遵守nsmutablecopying 協議的類才可以傳送mutablecopy訊息。假如傳送了乙個沒有遵守上訴兩協議而傳送 copy或者 mutablecopy,那麼就會發生異常。但是預設的ios類並沒有遵守這兩個協議。如果想自定義一下copy 那麼就必須遵守nscopying,並且實現 copywithzone: 方法,如果想自定義一下mutablecopy 那麼就必須遵守nsmutablecopying,並且實現 mutablecopywithzone: 方法。

@autoreleasepool

nslog(@"the retaincount is %ld",[retainarray retaincount]);

// insert code here...

nslog(@"hello, world!");

}@autoreleasepool

nslog(@"the retaincount is %ld",[retainarray retaincount]);

// insert code here...

nslog(@"hello, world!");

}

第四、copy和mutablecopy的區別

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

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

nsmutablearray *array1=[arraycopy];

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

nsmutablearray *array2=[array mutablecopy];

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

// insert code here...

nslog(@"hello, world!");*array=[nsarray arraywithobjects:@"one",@"two", nil];

nsmutablearray *array1=[arraycopy];

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

nsmutablearray *array2=[array mutablecopy];

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

// insert code here...

nslog(@"hello, world!");

第五、淺copy和深copy

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

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

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

nsmutablearray *array=[[nsmutablearray alloc] init];for(inti=0;i<3;i++)

for(nsobject *obj1inarray)

nsmutablearray *array2=[arraycopy];for(nsobject *obj2inarray2)

*array=[[nsmutablearray alloc] init];for(inti=0;i<3;i++)

for(nsobject *obj1inarray)

nsmutablearray *array2=[arraycopy];for(nsobject *obj2inarray2)

2013-09-3017:28

:01.492fdas[681:303] 位址為0x1001081f0,引用計數是12013-09-3017:28

:01.506fdas[681:303] 位址為0x100108230,引用計數是12013-09-3017:28

:01.506fdas[681:303] 位址為0x100108240,引用計數是12013-09-3017:28

:01.507fdas[681:303] 位址為0x1001081f0,引用計數是22013-09-3017:28

:01.507fdas[681:303] 位址為0x100108230,引用計數是22013-09-3017:28

:01.507fdas[681:303] 位址為0x100108240,引用計數是217:28

:01.492fdas[681:303] 位址為0x1001081f0,引用計數是12013-09-3017:28

:01.506fdas[681:303] 位址為0x100108230,引用計數是12013-09-3017:28

:01.506fdas[681:303] 位址為0x100108240,引用計數是12013-09-3017:28

:01.507fdas[681:303] 位址為0x1001081f0,引用計數是22013-09-3017:28

:01.507fdas[681:303] 位址為0x100108230,引用計數是22013-09-3017:28

:01.507fdas[681:303] 位址為0x100108240,引用計數是2

對this 的深入理解

this的取值,分四種情況。我們來挨個看一下。在此再強調一遍乙個非常重要的知識點 在函式中this到底取何值,是在函式真正被呼叫執行的時候確定的,函式定義的時候確定不了。因為this的取值是執行上下文環境的一部分,每次呼叫函式,都會產生乙個新的執行上下文環境。情況1 建構函式 所謂建構函式就是用來n...

對正規化的深入理解

資料庫的設計正規化是資料庫設計所需要滿足的規範,滿足這些規範的資料庫是簡潔的 結構明晰的,同時,不會發生插入 insert 刪除 delete 和更新 update 操作異常。反之則是亂七八糟,不僅給資料庫的程式設計人員製造麻煩,而且面目可憎,可能儲存了大量不需要的冗餘資訊。正規化說明 1.1 第一...

對operator 的深入理解

比較了幾種operator 的處理方式,分析其正確和錯誤原因。比較了operator 的類內和類外定義兩種方式,分析其原因。include include using namespace std class gameplayer gameplayer int tp bool operator gam...