Objective-C淺拷貝和深拷貝

淺拷貝

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

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

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

iOS 裏面的淺拷貝

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

深拷貝

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

copyretain 的區別:

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

深拷貝

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

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

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

拷貝構造

固然在 ios 中並非全部的對象都支持copymutableCopy,遵照NSCopying協議的類能夠發送copy消息,遵照NSMutableCopying協議的類才能夠發送mutableCopy消息。字符串

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

拷貝構造

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

@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;
}
相關文章
相關標籤/搜索