淺復(fù)制
</br>
淺復(fù)制就是對內(nèi)存地址的復(fù)制,讓目標(biāo)對象指針和源對象指向同一片內(nèi)存空間困介。如:
char* str = (char*)malloc(100);
char* str2 = str;
淺復(fù)制只是對對象的簡單復(fù)制姐刁,讓幾個對象共用一片內(nèi)存,當(dāng)內(nèi)存銷毀的時候贿肩,指向這片內(nèi)存的幾個指針需要重新定義才可以使用峦椰,要不然會成為野指針。
iOS 里面的淺復(fù)制:
在 iOS 里面汰规, 使用retain 關(guān)鍵字進(jìn)行引用計(jì)數(shù)汤功,就是一種更加保險(xiǎn)的淺拷貝。他既讓幾個指針共用同一片內(nèi)存空間溜哮,又可以在release 由于計(jì)數(shù)的存在滔金,不會輕易的銷毀內(nèi)存,達(dá)到更加簡單使用的目的茂嗓。
深復(fù)制:
</br>
深復(fù)制是指復(fù)制對象的具體內(nèi)容餐茵,而內(nèi)存地址是自主分配的,復(fù)制結(jié)束之后述吸,兩個對象雖然存的值是相同的忿族,但是內(nèi)存地址不一樣,兩個對象也互不影響,互不干涉道批。
copy 與 retain 的區(qū)別:
copy 是創(chuàng)建一個新對象错英,retain 是創(chuàng)建一個指針,引用對象計(jì)數(shù)加一屹徘。 copy屬性標(biāo)識兩個對象內(nèi)容相同走趋,新的對象retainCount為1, 與舊有對象引用計(jì)數(shù)無關(guān),舊有對象沒有變化噪伊。copy減少對象對上下文的依賴簿煌。
iOS里的深復(fù)制:
iOS提供了copy和mutableCopy方法,顧名思義鉴吹,copy就是復(fù)制了一個imutable的對象姨伟,而mutableCopy就是復(fù)制了一個mutable的對象。以下將舉幾個例子來說明豆励。
這里指的是NSString, NSNumber等等一類的對象夺荒。
NSString *string = @”dddd";
NSString *stringCopy = [string copy];
NSMutableString *stringDCopy = [string mutableCopy];
[stringMCopy appendString:@"!!"];
查看內(nèi)存可以發(fā)現(xiàn),string和stringCopy指向的是同一塊內(nèi)存區(qū)域(weak reference),引用計(jì)數(shù)沒有發(fā)生改變良蒸。而stringMCopy則是我們所說的真正意義上的復(fù)制技扼,系統(tǒng)為其分配了新內(nèi)存,是兩個獨(dú)立的字符串內(nèi)容是一樣的嫩痰。
拷貝構(gòu)造:
當(dāng)然在 ios 中并不是所有的對象都支持copy剿吻,mutableCopy,遵守NSCopying協(xié)議的類可以發(fā)送copy消息串纺,遵守NSMutableCopying協(xié)議的類才可以發(fā)送mutableCopy消息丽旅。
假如發(fā)送了一個沒有遵守上訴兩協(xié)議而發(fā)送copy或者 mutableCopy,那么就會發(fā)生異常。但是默認(rèn)的ios類并沒有遵守這兩個協(xié)議纺棺。如果想自定義一下copy 那么就必須遵守NSCopying,并且實(shí)現(xiàn) copyWithZone: 方法榄笙,如果想自定義一下mutableCopy 那么就必須遵守NSMutableCopying,并且實(shí)現(xiàn) mutableCopyWithZone: 方法。
如果是我們定義的對象祷蝌,那么我們自己要實(shí)現(xiàn)NSCopying , NSMutableCopying這樣就能調(diào)用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拷貝構(gòu)造:
- (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拷貝構(gòu)造:
- (id)mutableCopyWithZone:(NSZone *)zone{
MyObj *copy = NSCopyObject(self, 0, zone);
copy->name = [_name mutableCopy];
copy->age = age;
return copy;
}