標籤:http io ar os 使用 sp strong on 2014
淺拷貝
淺拷貝就是對記憶體位址的複製,讓目標對象指標和來源物件指向同一片記憶體空間。如:
char* str = (char*)malloc(100);char* str2 = str;
淺拷貝只是對對象的簡單拷貝,讓幾個對象共用一片記憶體,當記憶體銷毀的時候,指向這片記憶體的幾個指標需要重新定義才可以使用,要不然會成為野指標。
iOS 裡面的淺拷貝:
在 iOS 裡面, 使用retain 關鍵字進行引用計數,就是一種更加保險的淺拷貝。他既讓幾個指標共用同一片記憶體空間,又可以在release 由於計數的存在,不會輕易的銷毀記憶體,達到更加簡單使用的目的。
深拷貝:
深拷貝是指拷貝對象的具體內容,而記憶體位址是自主分配的,拷貝結束之後,兩個對象雖然存的值是相同的,但是記憶體位址不一樣,兩個對象也互不影響,互不干涉。
copy 與 retain 的區別:
copy 是建立一個新對象,retain 是建立一個指標,引用對象計數加一。 copy屬性標識兩個對象內容相同,新的對象retain count為1, 與舊有對象引用計數無關,舊有對象沒有變化。copy減少對象對內容相關的依賴。
iOS裡的深拷貝:
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;
copy拷貝構造:
- (id)copyWithZone:(NSZone *)zone{ MyObj *copy = [[[self class] allocWithZone :zone] init]; copy->name = [_name copy]; copy->imutableStr = [_imutableStr copy]; copy->age = age; return copy;}
mutableCopy拷貝構造:
- (id)mutableCopyWithZone:(NSZone *)zone{ MyObj *copy = NSCopyObject(self, 0, zone); copy->name = [_name mutableCopy]; copy->age = age; return copy;}
http://www.cocoachina.com/ios/20141113/10213.html
Objective-C中的淺拷貝和深拷貝