Chapter 18 Copying Objects

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ù)制引用而已,如果你想做到改變拷貝而不改變原值就必須深度復(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的,你可以直接返回引用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 不敢說覆蓋OC中所有copy的知識(shí)點(diǎn),但最起碼是目前最全的最新的一篇關(guān)于 copy的技術(shù)文檔了。后續(xù)發(fā)現(xiàn)有新...
    zyydeveloper閱讀 3,715評(píng)論 4 35
  • 作為一個(gè)20年教齡的鄉(xiāng)村教師,本來我還是挺安于自己工作,幸福感滿滿的。每天和學(xué)生打交道,單純快樂。工資不高,但是不...
    香杉閱讀 362評(píng)論 0 0
  • 其實(shí)畫了衣服就想棄坑,慘不忍睹。可是一想,本來就是畫小丑,難看就難看吧~捂嘴笑…… 成品圖 上一張與原圖的對(duì)比圖 線稿
    水漾七七閱讀 594評(píng)論 6 3
  • 其實(shí)·有很多話 一談便·滔滔不絕· 不斷的在思考·在質(zhì)疑· 為什么? 自己決定的·扛在自己的肩上的· 許多的有心無...
    one_two12閱讀 156評(píng)論 0 2
  • 文/達(dá)佚 從出租車上下來張兵直接鉆進(jìn)這幢房子臨街的樓道里。 門口寫著,二樓紅樓夢賓館,三樓私人按摩,四樓北斗星輔導(dǎo)...
    達(dá)佚閱讀 697評(píng)論 0 4

友情鏈接更多精彩內(nèi)容