淺拷貝就是對內存地址的複製,讓目標對象指針和源對象指向同一片內存空間。如:ios
char* str = (char*)malloc(100); char* str2 = str;
淺拷貝只是對對象的簡單拷貝,讓幾個對象共用一片內存,當內存銷燬的時候,指向這片內存的幾個指針須要從新定義纔可使用,要否則會成爲野指針。app
在 iOS 裏面, 使用retain
關鍵字進行引用計數,就是一種更加保險的淺拷貝。他既讓幾個指針共用同一片內存空間,又能夠在release 因爲計數的存在,不會輕易的銷燬內存,達到更加簡單使用的目的。atom
深拷貝是指拷貝對象的具體內容,而內存地址是自主分配的,拷貝結束以後,兩個對象雖然存的值是相同的,可是內存地址不同,兩個對象也互不影響,互不干涉。指針
copy
與 retain
的區別:copy
是建立一個新對象,retain
是建立一個指針,引用對象計數加一。 copy
屬性標識兩個對象內容相同,新的對象retain count爲1, 與舊有對象引用計數無關,舊有對象沒有變化。copy
減小對象對上下文的依賴。code
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:
方法。string
若是是咱們定義的對象,那麼咱們本身要實現NSCopying
, NSMutableCopying
這樣就能調用copy
和mutablecopy
了。舉個例子: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; }