The copy and mutableCopy Methods
它們可以創(chuàng)建一份某個(gè)對(duì)象的拷貝,這是通過實(shí)現(xiàn)NSCopying協(xié)議做到的。
如果你想針對(duì)mutable和immutable對(duì)象分別進(jìn)行拷貝,你就必須還要實(shí)現(xiàn)NSMutableCopying協(xié)議熊咽,如下圖所示:
你也可以刪除指定下標(biāo)的元素,如下圖所示:
拷貝的mutable和immutable屬性與源的mutable和immutable屬性無關(guān)闹丐。
Shallow Versus Deep Copying
淺度復(fù)制還是只復(fù)制引用而已横殴,如果你想做到改變拷貝而不改變?cè)稻捅仨毶疃葟?fù)制。
深度復(fù)制并不是默認(rèn)情況下的復(fù)制行為卿拴,所以說無論你使用copy還是mutableCopy那都不是深度復(fù)制衫仑。
如果你想做深度復(fù)制,你就必須創(chuàng)建一個(gè)字符串堕花,然后對(duì)這個(gè)新的字符串進(jìn)行修改文狱,修改完后再用它去替換你原先想要修改的字符串。
但是此時(shí)這個(gè)新創(chuàng)建的字符串與這個(gè)目標(biāo)字符串仍然是同一個(gè)缘挽,你改一個(gè)就等于改倆瞄崇。
Implementing the <NSCopying> Protocol
你必須實(shí)現(xiàn)copyWithZone:方法來應(yīng)對(duì)拷貝行為呻粹,如果你想實(shí)現(xiàn)mutable和immutable拷貝行為,你還要實(shí)現(xiàn)NSMutableCopying協(xié)議中的mutableCopyWithZone:方法苏研。
前者應(yīng)該返回一個(gè)immutable拷貝后者應(yīng)該返回一個(gè)mutable拷貝等浊。
它的用法如下:
上圖中這個(gè)NSZone *是個(gè)很有用的類型,它可以通過把大量零散的空間組織在一起來達(dá)到空間優(yōu)化的目的摹蘑。你可以把它作為參數(shù)傳入copyWithZone:然后交給allocWithZone:處理筹燕。
如果父類實(shí)現(xiàn)了allocWithZone:方法,子類自然就繼承了衅鹿,那么子類的寫法就變成如下這樣子撒踪。
如果父類早就已經(jīng)實(shí)現(xiàn)了allocWithZone,那么你需要在你的copy方法中把父類以上層次中的成分統(tǒng)統(tǒng)復(fù)制一遍大渤。
Copying Objects in Setter and Getter Methods
在setter方法中也存在復(fù)制的問題制妄,也存在你改變參數(shù)的時(shí)候同時(shí)改變了屬性的問題,于是你可以這樣寫:
如果屬性中沒有加nonatomic修飾而是atomic兼犯,你的實(shí)例就必須加mutex鎖忍捡,雖然這會(huì)降低程序執(zhí)行效率集漾,但是為了線程安全這是必須的切黔。
對(duì)于屬性來說沒有mutableCopy限制,所以只能用copy加以限制具篇,所以這導(dǎo)致了immutable拷貝的生成纬霞。
相同的問題也會(huì)出現(xiàn)在getter中,即驱显,你get的結(jié)果不要影響原屬性的值诗芜。當(dāng)然如果屬性本身就是immutable的,你可以直接返回引用埃疫。