Objective C淺拷貝和深拷貝

Channnnne發表於2018-01-25

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

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

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

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

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

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

###深拷貝 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: 方法。

###拷貝構造 如果是我們定義的物件,那麼我們自己要實現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;
}
複製程式碼

相關文章