淺拷貝
淺拷貝就是對(duì)內(nèi)存地址的復(fù)制,讓目標(biāo)對(duì)象指針和源對(duì)象指向同一片內(nèi)存空間。如:
char* str = (char*)malloc(100);
char* str2 = str;
淺拷貝只是對(duì)對(duì)象的簡(jiǎn)單拷貝昭殉,讓幾個(gè)對(duì)象共用一片內(nèi)存撤防,當(dāng)內(nèi)存銷毀的時(shí)候妖碉,指向這片內(nèi)存的幾個(gè)指針需要重新定義才可以使用,要不然會(huì)成為野指針村砂。
iOS 里面的淺拷貝:
在 iOS 里面, 使用retain 關(guān)鍵字進(jìn)行引用計(jì)數(shù)屹逛,就是一種更加保險(xiǎn)的淺拷貝础废。他既讓幾個(gè)指針共用同一片內(nèi)存空間汛骂,又可以在release 由于計(jì)數(shù)的存在,不會(huì)輕易的銷毀內(nèi)存评腺,達(dá)到更加簡(jiǎn)單使用的目的帘瞭。
深拷貝:
深拷貝是指拷貝對(duì)象的具體內(nèi)容,而內(nèi)存地址是自主分配的蒿讥,拷貝結(jié)束之后蝶念,兩個(gè)對(duì)象雖然存的值是相同的,但是內(nèi)存地址不一樣诈悍,兩個(gè)對(duì)象也互不影響祸轮,互不干涉。
copy 與 retain 的區(qū)別:
copy 是創(chuàng)建一個(gè)新對(duì)象侥钳,retain 是創(chuàng)建一個(gè)指針适袜,引用對(duì)象計(jì)數(shù)加一。 copy屬性標(biāo)識(shí)兩個(gè)對(duì)象內(nèi)容相同舷夺,新的對(duì)象retain count為1, 與舊有對(duì)象引用計(jì)數(shù)無(wú)關(guān)苦酱,舊有對(duì)象沒有變化。copy減少對(duì)象對(duì)上下文的依賴给猾。
iOS里的深拷貝:
iOS提供了copy和mutableCopy方法疫萤,顧名思義,copy就是復(fù)制了一個(gè)imutable的對(duì)象敢伸,而mutableCopy就是復(fù)制了一個(gè)mutable的對(duì)象扯饶。以下將舉幾個(gè)例子來(lái)說明。
這里指的是NSString, NSNumber等等一類的對(duì)象池颈。
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)存每币,是兩個(gè)獨(dú)立的字符串內(nèi)容是一樣的。
拷貝構(gòu)造:
當(dāng)然在 ios 中并不是所有的對(duì)象都支持copy琢歇,mutableCopy兰怠,遵守NSCopying協(xié)議的類可以發(fā)送copy消息,遵守NSMutableCopying協(xié)議的類才可以發(fā)送mutableCopy消息李茫。
假如發(fā)送了一個(gè)沒有遵守上訴兩協(xié)議而發(fā)送copy或者 mutableCopy,那么就會(huì)發(fā)生異常揭保。但是默認(rèn)的ios類并沒有遵守這兩個(gè)協(xié)議。如果想自定義一下copy 那么就必須遵守NSCopying,并且實(shí)現(xiàn) copyWithZone: 方法涌矢,如果想自定義一下mutableCopy 那么就必須遵守NSMutableCopying,并且實(shí)現(xiàn) mutableCopyWithZone: 方法掖举。
如果是我們定義的對(duì)象,那么我們自己要實(shí)現(xiàn)NSCopying , NSMutableCopying這樣就能調(diào)用copy和mutablecopy了。舉個(gè)例子:
@interface MyObj : NSObject{
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;
returncopy;
}
mutableCopy拷貝構(gòu)造:
- (id)mutableCopyWithZone:(NSZone *)zone{
MyObj *copy = NSCopyObject(self, 0, zone);
copy->name = [_name mutableCopy];
copy->age = age;
returncopy;
}