一、淺拷貝及深拷貝
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è)指針?lè)謩e指向兩個(gè)對(duì)象;
3)當(dāng)其中一個(gè)對(duì)象改變或者銷毀后,另一個(gè)對(duì)象不受影響;
4)源對(duì)象引用計(jì)數(shù)不變,副本計(jì)數(shù)器設(shè)置為1
二、copy及mutableCopy
? ? NSObject類提供了copy和mutableCopy方法,通過(guò)這兩個(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é)論也是適用的,只不過(guò)是容器對(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í)例變量。(通過(guò)點(diǎn)語(yǔ)法賦值時(shí),實(shí)際上調(diào)用的就是setter方法)