深拷貝:深拷貝就是把內(nèi)容拷貝一份產(chǎn)生一份新的對(duì)象,新對(duì)象計(jì)數(shù)器為1,源對(duì)象計(jì)數(shù)器不變。
淺拷貝:而淺拷貝是指針拷貝,把地址給你,你和我指向同一個(gè)對(duì)象,源對(duì)象計(jì)數(shù)器加一,源對(duì)象和副本的計(jì)數(shù)器相同。
我們知道在OC中的拷貝函數(shù)有copy和mutablecopy:
copy
只要你調(diào)用了copy不管是NSString, NSDictionary還是NSArray還是NSMutableString還是NSMutableDictionary,還是NSMutableArray都是copy出來(lái)是不可變的副本。
如果是不可變對(duì)象進(jìn)行copy的話就相當(dāng)于淺拷貝,沒(méi)有產(chǎn)生一個(gè)新的對(duì)象相當(dāng)于retain操作了,因?yàn)镺C設(shè)置copy語(yǔ)法本身就是為了改變副本而不去影響源對(duì)象,所以為了性能著想既然copy出來(lái)的都不可變了,自然也就不會(huì)產(chǎn)生一個(gè)新的對(duì)象了。
如果是可變對(duì)象進(jìn)行copy的話就相當(dāng)于深拷貝,因?yàn)榭勺儗?duì)象變成了不可變對(duì)象了,結(jié)構(gòu)上發(fā)生了改變??偨Y(jié)來(lái)說(shuō)就是只有不可變對(duì)象調(diào)用copy為淺拷貝其他都是深拷貝。
mutablecopy
當(dāng)你調(diào)用mutablecopy產(chǎn)生的都是可變的副本??勺儗?duì)象和不可變對(duì)象進(jìn)行mutablecopy都是產(chǎn)生了一個(gè)新的對(duì)象,計(jì)數(shù)器為1,原來(lái)的對(duì)象計(jì)數(shù)器不變。
總結(jié):可變對(duì)象的copy和mutableCopy方法都是深拷貝,而且都是是單層拷貝也就是說(shuō)我有個(gè)數(shù)組a和數(shù)組b,我讓數(shù)組b = [a copy]或者 b = [a mutableCpoy],雖然b的地址和a的地址不同,但是其里面的數(shù)組元素的地址和原數(shù)組里面的對(duì)象的地址還是相同的,也就是說(shuō)數(shù)組內(nèi)容還是指向原數(shù)組里面的元素的。
如果我們想讓一個(gè)類的對(duì)象進(jìn)行拷貝操作就要讓這個(gè)類要實(shí)現(xiàn)NSCopying或者NSMutableCopying協(xié)議。然后我們還要在類的.m文件中實(shí)現(xiàn)-(id)copyWithZone:(NSZone *)zone方法,其中zone指向新的一塊存儲(chǔ)空間,是系統(tǒng)已經(jīng)給我們分配的內(nèi)存。具體實(shí)現(xiàn)如下:
