##淺拷貝 淺拷貝就是對記憶體地址的複製,讓目標物件指標和源物件指向同一片記憶體空間。如:
char* str = (char*)malloc(100);
char* str2 = str;
複製程式碼
淺拷貝只是對物件的簡單拷貝,讓幾個物件共用一片記憶體,當記憶體銷燬的時候,指向這片記憶體的幾個指標需要重新定義才可以使用,要不然會成為野指標。
###iOS 裡面的淺拷貝
在 iOS 裡面, 使用retain
關鍵字進行引用計數,就是一種更加保險的淺拷貝。他既讓幾個指標共用同一片記憶體空間,又可以在release 由於計數的存在,不會輕易的銷燬記憶體,達到更加簡單使用的目的。
##深拷貝 深拷貝是指拷貝物件的具體內容,而記憶體地址是自主分配的,拷貝結束之後,兩個物件雖然存的值是相同的,但是記憶體地址不一樣,兩個物件也互不影響,互不干涉。
###copy
與 retain
的區別:
copy
是建立一個新物件,retain
是建立一個指標,引用物件計數加一。 copy
屬性標識兩個物件內容相同,新的物件retain count為1, 與舊有物件引用計數無關,舊有物件沒有變化。copy
減少物件對上下文的依賴。
###深拷貝
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;
複製程式碼
拷貝構造:
(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;
}
複製程式碼