iOS之拷貝

對象拷貝

  1. 淺拷貝和深拷貝

    1. 深淺拷貝便於理解的定義,如下:
      1. 淺拷貝:在拷貝操作時,對於被拷貝的對象的每一層拷貝都是指針拷貝。
      2. 深拷貝:在拷貝操作時,對於被拷貝的對象至少有一層拷貝是深拷貝。
      3. 完全拷貝:在拷貝操作時,對於被拷貝的對象的每一層拷貝都是對象拷貝。
注:
      1. 所謂的層次劃分是指數組對象本身和數組內對象的層次。
      2. 在拷貝操作時,對於對象有n層時對象拷貝,我們可稱作n級深拷貝,此處n應大於等於1.
      3. 對於完全拷貝目前通用辦法是:迭代法和歸檔
      4. 指針拷貝俗稱指針拷貝,對象拷貝也俗稱內容拷貝。
      5. 一般來講: 淺層拷貝:拷貝引用對象的指針;深層拷貝:拷貝引用對象內容。
想要實現對象拷貝,要向被拷貝的對象發送retain、copy、mutableCopy消息。

2.結論

retain:始終是淺拷貝。引用計數每次加1。返回對象是否可變與被拷貝的對象保持一致。
copy:對於可變對象爲深拷貝,引用計數不改變;對於不可變對象是淺拷貝,引用計數每次加1。始終返回一個不可變對象。
mutableCopy:始終是深拷貝,引用計數不改變。始終返回一個可變對象。

3.使用場景

深拷貝是在要將一個對象從可變(不可變)轉爲不可變(可變)或者將一個對象內容克隆一份時用到。
淺拷貝是在要拷貝一個對象的指針時用到。

2.在程序中實現對象拷貝

OC中並不是所有的類都支持拷貝,只有遵循NSCopying協議的類,才支持copy拷貝;只有遵循NSMutableCopying協議的類,才支持mutableCopy拷貝。
如果沒有遵循上述兩種協議的類,運用拷貝會發出異常。
如果是自定義的類,那麼我們需要註銷NSCopying、NSMutableCopying協議,然後重寫 - (id)copyWithZone:(NSZone *)zone 和 - (id)mutableCopyWithZone:(NSZone *)zone這兩個方法,這樣就能調用copy和mutableCopy了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章