Objective C淺拷貝和深拷貝

##淺拷貝 淺拷貝就是對內存地址的複製,讓目標對象指針和源對象指向同一片內存空間。如:ios

char* str = (char*)malloc(100);
char* str2 = str;
複製代碼

淺拷貝只是對對象的簡單拷貝,讓幾個對象共用一片內存,當內存銷燬的時候,指向這片內存的幾個指針須要從新定義纔可使用,要否則會成爲野指針。bash

###iOS 裏面的淺拷貝 在 iOS 裏面, 使用retain 關鍵字進行引用計數,就是一種更加保險的淺拷貝。他既讓幾個指針共用同一片內存空間,又能夠在release 因爲計數的存在,不會輕易的銷燬內存,達到更加簡單使用的目的。app

##深拷貝 深拷貝是指拷貝對象的具體內容,而內存地址是自主分配的,拷貝結束以後,兩個對象雖然存的值是相同的,可是內存地址不同,兩個對象也互不影響,互不干涉。ui

###copyretain 的區別: copy 是建立一個新對象,retain 是建立一個指針,引用對象計數加一。 copy屬性標識兩個對象內容相同,新的對象retain count爲1, 與舊有對象引用計數無關,舊有對象沒有變化。copy減小對象對上下文的依賴。atom

###深拷貝 iOS提供了copymutableCopy方法,顧名思義,copy就是複製了一個imutable的對象,而mutableCopy就是複製了一個mutable的對象。如下將舉幾個例子來講明。 這裏指的是NSString, NSNumber等等一類的對象。spa

NSString *string = @」dddd"; NSString *stringCopy = [string copy]; NSMutableString *stringDCopy = [string mutableCopy]; [stringMCopy appendString:@"!!"]; 複製代碼

查看內存能夠發現,stringstringCopy指向的是同一塊內存區域(weak reference),引用計數沒有發生改變。而stringMCopy則是咱們所說的真正意義上的複製,系統爲其分配了新內存,是兩個獨立的字符串內容是同樣的。指針

##拷貝構造 固然在 ios 中並非全部的對象都支持copymutableCopy,遵照NSCopying協議的類能夠發送copy消息,遵照NSMutableCopying協議的類才能夠發送mutableCopy消息。code

假如發送了一個沒有遵照上訴兩協議而發送copy或者 mutableCopy,那麼就會發生異常。可是默認的ios類並無遵照這兩個協議。若是想自定義一下copy 那麼就必須遵照NSCopying,而且實現 copyWithZone: 方法,若是想自定義一下mutableCopy 那麼就必須遵照NSMutableCopying,而且實現 mutableCopyWithZone: 方法。對象

###拷貝構造 若是是咱們定義的對象,那麼咱們本身要實現NSCopying , NSMutableCopying這樣就能調用copymutablecopy了。舉個例子:內存

@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;
複製代碼

拷貝構造:

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

拷貝構造:

- (id)mutableCopyWithZone:(NSZone *)zone{
    MyObj *copy = NSCopyObject(self, 0, zone);
    copy->name = [_name mutableCopy];
    copy->age = age;
    return copy;
}
複製代碼
相關文章
相關標籤/搜索