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