OC中的copy :利用一個(gè)源對(duì)象產(chǎn)生一個(gè)副本對(duì)象
修改源的屬性和行為饭庞,不會(huì)影響副本對(duì)象
修改副本對(duì)象的屬性和行為令宿,不會(huì)影響源對(duì)象
1.Copy的使用
一個(gè)對(duì)象可以調(diào)用copy或者mutableCopy 方法來創(chuàng)建一個(gè)副本對(duì)象
copy:創(chuàng)建的是不可變副本(NSString , NSArray, NSDictionary)
mutableCopy : 創(chuàng)建的是可變副本( NSMutableString , NSMutableArray, NSMutableDictionary)
使用copy功能前提是必須遵守NSCopying 協(xié)議 同時(shí)實(shí)現(xiàn)copywithzone方法愧口,
同理使用mutableCopy 必須遵守NSmutableCopying 協(xié)議 和實(shí)現(xiàn)mutableCopywithzone方法
2.Copy的注意
--1.不可變對(duì)象 調(diào)用 Copy ----> 返回 不可變對(duì)象 (不會(huì)? ? 產(chǎn)生一個(gè)新的對(duì)象)
因?yàn)樵瓉淼膶?duì)象是不能修改的 copy返回的對(duì)象也是不可修改的雨让,既然兩個(gè)對(duì)象都不能修改独撇,所以永遠(yuǎn)不能影響到另外一個(gè)對(duì)象丽涩,所以產(chǎn)生一個(gè)新的對(duì)象是沒有意義的,(OC對(duì)內(nèi)存進(jìn)行優(yōu)化拄显,就不會(huì)產(chǎn)生一個(gè)新的對(duì)象)
--2.可變對(duì)象 調(diào)用 copy ---->? 返回一個(gè)不可變對(duì)象 (ARC下會(huì)產(chǎn)生一個(gè)新對(duì)象苟径,而MRC下不會(huì)產(chǎn)生新對(duì)象)
具體情況不一一列舉?
總結(jié)為?
在MRC 下
--1.通過copy 產(chǎn)生的都是不可變對(duì)象? 通過mutablecopy產(chǎn)生的都是可變對(duì)象
--2.copy 不會(huì)產(chǎn)生新的對(duì)象
在ARC 下
--1.通過copy 產(chǎn)生的都是不可變對(duì)象? 通過mutablecopy產(chǎn)生的都是可變對(duì)象
--2.只有通過copy + 不可變對(duì)象 不會(huì)產(chǎn)生新的對(duì)象?
3.深copy 和 淺copy
--1.若是沒有生成一個(gè)新的對(duì)象,我們稱之為淺copy躬审,本質(zhì)就是一個(gè)指針copy
--2.若是生成一個(gè)新的對(duì)象棘街,我們稱之為深copy,本質(zhì)會(huì)創(chuàng)建一個(gè)新的對(duì)象
4.copy 在MRC下 內(nèi)存管理
--1.淺copy 不會(huì)生成新的對(duì)象
但需要注意的是承边,淺copy會(huì)對(duì)以前的源對(duì)象進(jìn)行一次retain? 而新返回的對(duì)象引用計(jì)數(shù)和源對(duì)象相同
sososo 在釋放時(shí)遭殉,需要對(duì)源對(duì)象進(jìn)行一次release
--2.深copy 會(huì)產(chǎn)生新的對(duì)象,不會(huì)對(duì)源對(duì)象進(jìn)行retain 博助,而新生成的對(duì)象险污,需要在釋放時(shí)進(jìn)行一次release?