對象拷貝操作也比較常見聚磺,在ObjC中有兩種方式的拷貝:copy和mutablecopy鹃栽,這兩種方式都將產(chǎn)生一個新的對象穿扳,只是后者產(chǎn)生的是一個可變對象谱姓。在ObjC中如果要想實現(xiàn)copy或者mutablecopy操作需要實現(xiàn)NSCopy或者NSMutableCopy協(xié)議借尿,拷貝操作產(chǎn)生的新的對象默認(rèn)引用計數(shù)器是1,在非ARC模式下我們應(yīng)該對這個對象進(jìn)行內(nèi)存管理屉来。在熟悉這兩種操作之前我們首先需要弄清兩個概念:深復(fù)制(或深拷貝)和淺復(fù)制(或淺拷貝)路翻。
淺復(fù)制:在執(zhí)行復(fù)制操作時,對于對象中每一層(對象中包含的對象茄靠,例如說屬性是某個對象類型)復(fù)制都是指針復(fù)制(如果從引用計數(shù)器角度出發(fā)茂契,那么每層對象的引用計數(shù)器都會加1)。
深復(fù)制:在執(zhí)行復(fù)制操作時慨绳,至少有一個對象的復(fù)制是對象內(nèi)容復(fù)制(如果從引用計數(shù)器角度出發(fā)掉冶,那么除了對象內(nèi)容復(fù)制的那個對象的引用計數(shù)器不變真竖,其他指針復(fù)制的對象其引用計數(shù)器都會加1)。
對比copy和mutablecopy其實前面我們一直還用到一個操作是retain厌小,它們之間的關(guān)系如下:
retain:始終采取淺復(fù)制恢共,引用計數(shù)器會加1,返回的對象和被復(fù)制對象是同一個對象1(也就是說這個對象的引用多了一個召锈,或者說是指向這個對象的指針多了一個)旁振;
copy:對于不可變對象copy采用的是淺復(fù)制,引用計數(shù)器加1(其實這是編譯器進(jìn)行了優(yōu)化涨岁,既然原來的對象不可變拐袜,復(fù)制之后的對象也不可變那么就沒有必要再重新創(chuàng)建一個對象了);對于可變對象copy采用的是深復(fù)制梢薪,引用計數(shù)器不變(原來的對象是可變蹬铺,現(xiàn)在要產(chǎn)生一個不可變的當(dāng)然得重新產(chǎn)生一個對象);
mutablecopy:無論是可變對象還是不可變對象采取的都是深復(fù)制秉撇,引用計數(shù)器不變(如果從一個不可變對象產(chǎn)生一個可變對象自然不用說兩個對象絕對不一樣肯定是深復(fù)制甜攀;如果從一個可變對象產(chǎn)生出另一個可變對象,那么當(dāng)其中一個對象改變自然不希望另一個對象改變琐馆,當(dāng)然也是深復(fù)制)规阀。