##淺拷貝 淺拷貝就是對內存地址的複製,讓目標對象指針和源對象指向同一片內存空間。如:ios
char* str = (char*)malloc(100);
char* str2 = str;
複製代碼
淺拷貝只是對對象的簡單拷貝,讓幾個對象共用一片內存,當內存銷燬的時候,指向這片內存的幾個指針須要從新定義纔可使用,要否則會成爲野指針。bash
###iOS 裏面的淺拷貝 在 iOS 裏面, 使用retain
關鍵字進行引用計數,就是一種更加保險的淺拷貝。他既讓幾個指針共用同一片內存空間,又能夠在release 因爲計數的存在,不會輕易的銷燬內存,達到更加簡單使用的目的。app
##深拷貝 深拷貝是指拷貝對象的具體內容,而內存地址是自主分配的,拷貝結束以後,兩個對象雖然存的值是相同的,可是內存地址不同,兩個對象也互不影響,互不干涉。ui
###copy
與 retain
的區別: copy
是建立一個新對象,retain
是建立一個指針,引用對象計數加一。 copy
屬性標識兩個對象內容相同,新的對象retain count爲1, 與舊有對象引用計數無關,舊有對象沒有變化。copy
減小對象對上下文的依賴。atom
###深拷貝 iOS提供了copy
和mutableCopy
方法,顧名思義,copy
就是複製了一個imutable的對象,而mutableCopy
就是複製了一個mutable的對象。如下將舉幾個例子來講明。 這裏指的是NSString
, NSNumber
等等一類的對象。spa
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
消息。code
假如發送了一個沒有遵照上訴兩協議而發送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;
}
複製代碼