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