一撒璧、淺拷貝及深拷貝
1、淺拷貝(指針copy)
1)相當(dāng)于對(duì)指向?qū)ο蟮闹羔樳M(jìn)行復(fù)制及刻,產(chǎn)生一個(gè)新的指向?qū)ο蟮闹羔槪?/p>
2)就有兩個(gè)指針指向同一個(gè)對(duì)象镀裤;
3)這個(gè)對(duì)象銷毀后,兩個(gè)指針都應(yīng)置空;
4)對(duì)象引用計(jì)數(shù)+1
2缴饭、深拷貝(內(nèi)容copy)
深copy不僅會(huì)復(fù)制對(duì)象本身暑劝,而且會(huì)遞歸復(fù)制每個(gè)指針類型的實(shí)例變量,直到兩個(gè)對(duì)象沒有任何公共的部分颗搂。
1)相當(dāng)于對(duì)對(duì)象進(jìn)行復(fù)制担猛,產(chǎn)生一個(gè)新的對(duì)象;
2)就有兩個(gè)指針分別指向兩個(gè)對(duì)象;
3)當(dāng)其中一個(gè)對(duì)象改變或者銷毀后傅联,另一個(gè)對(duì)象不受影響先改;
4)源對(duì)象引用計(jì)數(shù)不變,副本計(jì)數(shù)器設(shè)置為1
二蒸走、copy及mutableCopy
? ? NSObject類提供了copy和mutableCopy方法仇奶,通過這兩個(gè)方法即可復(fù)制已有對(duì)象的副本。
? ? ?NSString,NSMUtablestring等系統(tǒng)類默認(rèn)遵守NSCoppying及NSMUtableCoppying協(xié)議比驻。
? ? ?只有不可變對(duì)象創(chuàng)建的不可變副本(copy)才是淺copy,其它都是深copy该溯。
1、copy方法
1)只要調(diào)用copy方法别惦,總是返回對(duì)象的不可修改的副本狈茉。即便該對(duì)象本身是可修改的
2)eg: 調(diào)用NSMUtableString的copy方法,將返回不可修改的字符串對(duì)象掸掸。
2氯庆、mutableCopy方法
1)只要調(diào)用mutableCopy方法,總是返回對(duì)象的可變副本猾漫。即便該對(duì)象本身是不可修改的点晴。
2)eg: 調(diào)用NSString的mutableCopy方法,總是返回對(duì)象的可修改的字符串對(duì)象悯周。
3、示例代碼
4陪竿、系統(tǒng)對(duì)象總結(jié)
1禽翼、對(duì)于系統(tǒng)的非容器類對(duì)象(eg:NSString,NSMUtableString)
如果對(duì)[不可變]對(duì)象復(fù)制,copy是指針復(fù)制(淺拷貝), mutableCopy就是對(duì)象復(fù)制(深拷貝)族跛。
如果是對(duì)可變對(duì)象復(fù)制闰挡,都是深拷貝,但是copy返回的對(duì)象是不可變的礁哄。
2长酗、對(duì)于系統(tǒng)的容器類對(duì)象(eg:NSArray ,NSDictionary)
對(duì)于容器類本身,上面討論的結(jié)論也是適用的,只不過是容器對(duì)象中的元素是是淺copy桐绒。
5夺脾、自定義類調(diào)用copy與mutableCopy復(fù)制對(duì)象的副本
6、setter方法的copy選項(xiàng)
1)copy指示符就是指定當(dāng)前程序調(diào)用setter方法復(fù)制時(shí)茉继,實(shí)際上是將傳入?yún)?shù)的副本賦值給程序的實(shí)例變量咧叭。(通過點(diǎn)語(yǔ)法賦值時(shí),實(shí)際上調(diào)用的就是setter方法)