Copy & MutableCopy
使用copy或mutableCopy方法可以創(chuàng)建一個對象的副本
copy
需要實現(xiàn)NSCoppying協(xié)議
這些創(chuàng)建的是不可變副本(如NSString肴盏、NSArray、NSDictionary)
mutableCopy
需要先實現(xiàn)NSMutableCopying協(xié)議
創(chuàng)建的是可變副本(如NSMutableString究抓、NSMutableArray昂利、NSMutableDictionary)
Copy的目的是建立副本登刺,同時修改原始對象和復(fù)本不會互相干擾
深復(fù)制 & 淺復(fù)制
深復(fù)制:
內(nèi)容拷貝手负,源對象和副本指向的是不同的兩個對象;
深拷貝是指拷貝對象的具體內(nèi)容篡诽,而內(nèi)存地址是自主分配的冗茸,拷貝結(jié)束之后席镀,兩個對象雖然存的值是相同的,但是內(nèi)存地址不一樣夏漱,兩個對象也互不影響豪诲,互不干涉。
copy 與 retain 的區(qū)別:
copy 是創(chuàng)建一個新對象挂绰,retain 是創(chuàng)建一個指針跛溉,引用對象計數(shù)加一。 copy屬性標(biāo)識兩個對象內(nèi)容相同扮授,新的對象retain count為1, 與舊有對象引用計數(shù)無關(guān)芳室,舊有對象沒有變化。copy減少對象對上下文的依賴刹勃。
源對象引用計數(shù)器不變堪侯,副本計數(shù)器設(shè)置為1
iOS提供了copy和mutableCopy方法,顧名思義荔仁,copy就是復(fù)制了一個imutable的對象伍宦,而mutableCopy就是復(fù)制了一個mutable的對象。
淺復(fù)制:
指針拷貝乏梁,源對象和副本指向的是同一個對象
對象的引用計數(shù)器+1次洼,其實相當(dāng)于做了一次retain操作
在 iOS 里面, 使用retain 關(guān)鍵字進行引用計數(shù)遇骑,就是一種更加保險的淺拷貝卖毁。他既讓幾個指針共用同一片內(nèi)存空間,又可以在release 由于計數(shù)的存在落萎,不會輕易的銷毀內(nèi)存亥啦,達到更加簡單使用的目的。
淺拷貝就是對內(nèi)存地址的復(fù)制练链,讓目標(biāo)對象指針和源對象指向同一片內(nèi)存空間翔脱。如:
char* str = (char*)malloc(100);
char* str2 = str;
淺拷貝只是對對象的簡單拷貝,讓幾個對象共用一片內(nèi)存媒鼓,當(dāng)內(nèi)存銷毀的時候届吁,指向這片內(nèi)存的幾個指針需要重新定義才可以使用错妖,要不然會成為野指針。
只有不可變對象創(chuàng)建不可變副本(copy)才是淺復(fù)制疚沐,其他都是深復(fù)制
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),引用計數(shù)沒有發(fā)生改變。而stringMCopy則是我們所說的真正意義上的復(fù)制濒旦,系統(tǒng)為其分配了新內(nèi)存,是兩個獨立的字符串內(nèi)容是一樣的再登。
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;
}