Objective-C中的淺拷貝和深拷貝

來源:互聯網
上載者:User

標籤:http   io   ar   os   使用   sp   strong   on   2014   

淺拷貝

淺拷貝就是對記憶體位址的複製,讓目標對象指標和來源物件指向同一片記憶體空間。如:

char* str = (char*)malloc(100);char* str2 = str;

淺拷貝只是對對象的簡單拷貝,讓幾個對象共用一片記憶體,當記憶體銷毀的時候,指向這片記憶體的幾個指標需要重新定義才可以使用,要不然會成為野指標。

iOS 裡面的淺拷貝:

在 iOS 裡面, 使用retain 關鍵字進行引用計數,就是一種更加保險的淺拷貝。他既讓幾個指標共用同一片記憶體空間,又可以在release 由於計數的存在,不會輕易的銷毀記憶體,達到更加簡單使用的目的。

深拷貝:

深拷貝是指拷貝對象的具體內容,而記憶體位址是自主分配的,拷貝結束之後,兩個對象雖然存的值是相同的,但是記憶體位址不一樣,兩個對象也互不影響,互不干涉。

copy 與 retain 的區別:

copy 是建立一個新對象,retain 是建立一個指標,引用對象計數加一。 copy屬性標識兩個對象內容相同,新的對象retain count為1, 與舊有對象引用計數無關,舊有對象沒有變化。copy減少對象對內容相關的依賴。

iOS裡的深拷貝:

iOS提供了copy和mutableCopy方法,顧名思義,copy就是複製了一個imutable的對象,而mutableCopy就是複製了一個mutable的對象。以下將舉幾個例子來說明。
這裡指的是NSString, NSNumber等等一類的對象。

NSString *string = @”dddd";NSString *stringCopy = [string copy];NSMutableString *stringDCopy = [string mutableCopy];[stringMCopy appendString:@"!!"];

查看記憶體可以發現,string和stringCopy指向的是同一塊記憶體地區(weak reference),引用計數沒有發生改變。而stringMCopy則是我們所說的真正意義上的複製,系統為其分配了新記憶體,是兩個獨立的字串內容是一樣的。

拷貝構造:

當然在 ios 中並不是所有的對象都支援copy,mutableCopy,遵守NSCopying協議的類可以發送copy訊息,遵守NSMutableCopying協議的類才可以發送mutableCopy訊息。

假如發送了一個沒有遵守上訴兩協議而發送copy或者 mutableCopy,那麼就會發生異常。但是預設的ios類並沒有遵守這兩個協議。如果想自訂一下copy 那麼就必須遵守NSCopying,並且實現 copyWithZone: 方法,如果想自訂一下mutableCopy 那麼就必須遵守NSMutableCopying,並且實現 mutableCopyWithZone: 方法。

如果是我們定義的對象,那麼我們自己要實現NSCopying , NSMutableCopying這樣就能調用copy和mutablecopy了。舉個例子:

@interface MyObj : NSObject<NSCopying, NSMutableCopying>{    NSMutableString *_name;    NSString * _imutableStr ;    int _age;}     @property (nonatomic, retain) NSMutableString *name;@property (nonatomic, retain) NSString *imutableStr;@property (nonatomic) int age;

copy拷貝構造:

- (id)copyWithZone:(NSZone *)zone{    MyObj *copy = [[[self class] allocWithZone :zone] init];    copy->name = [_name copy];    copy->imutableStr = [_imutableStr copy];    copy->age = age;    return copy;}

mutableCopy拷貝構造:

- (id)mutableCopyWithZone:(NSZone *)zone{    MyObj *copy = NSCopyObject(self, 0, zone);    copy->name = [_name mutableCopy];    copy->age = age;    return copy;}

http://www.cocoachina.com/ios/20141113/10213.html

Objective-C中的淺拷貝和深拷貝

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.