retain屬性表示兩個物件位址相同(建立乙個指標,指標拷貝),內容當然相同,這個物件的retain值+1也就是說,retain 是指標拷貝(淺拷貝),copy 是內容拷貝(深拷貝)。
ios中並不是所有的物件都支援copy,mutablecopy,遵守nscopying 協議的類可以傳送copy訊息,遵守nsmutablecopying 協議的類才可以傳送mutablecopy訊息。假如傳送了乙個沒有遵守上訴兩協議而傳送 copy或者 mutablecopy,那麼就會發生異常。但是預設的ios類並沒有遵守這兩個協議。如果想自定義一下copy 那麼就必須遵守nscopying,並且實現 copywithzone: 方法,如果想自定義一下mutablecopy 那麼就必須遵守nsmutablecopying,並且實現 mutablecopywithzone: 方法。
由於在程式中經常會遇到集合類的傳值,所以,簡單的retain未必夠用,需要對集合內容的拷貝,也就是深拷貝。
下面我們就來**一下。
ios提供了copy和mutablecopy方法,顧名思義,copy就是複製了乙個imutable的物件,而mutablecopy就是複製了乙個mutable的物件。以下將舉幾個例子來說明。
1. 系統的非容器類物件
這裡指的是nsstring,nsnumber等等一類的物件。
對於系統的非容器類物件,我們可以認為,如果對一不可變物件複製,copy是指標複製(淺拷貝)和mutablecopy就是物件複製(深拷貝)。如果是對可變物件複製,都是深拷貝,但是copy返回的物件是不可變的。
2. 系統的容器類物件
指nsarray,nsdictionary等。對於容器類本身,上面討論的結論也是適用的,需要**的是複製後容器內物件的變化。
//copy返回不可變物件,mutablecopy返回可變物件
對於容器而言,其元素物件始終是指標複製。如果需要元素物件也是物件複製,就需要實現深拷貝
3. 自定義物件
如果是我們定義的物件,那麼我們自己要實現nscopying,nsmutablecopying這樣就能呼叫copy和mutablecopy了
深拷貝和淺拷貝的區別
一.深拷貝 源物件和副本物件是不同的兩個物件 源物件引用計數不變,副本物件計數器為1 因為是新產生的 至少有一層是物件複製 二.淺拷貝 源物件和副本物件是同乙個物件 源物件 副本物件 引用計數器 1,相當於做一次retain操作 本質 沒有產生新的物件 三.完全複製 對於被複製的物件每一層都是物件複...
深拷貝和淺拷貝的區別
深淺拷貝的區別 淺拷貝是將原始物件中的資料型字段拷貝到新物件中去,將引用型字段的 引用 複製到新物件中去,不把 引用的物件 複製進去,所以原始物件和新物件引用同一物件,新物件中的引用型字段發生變化會導致原始物件中的對應欄位也發生變化。深拷貝是在引用方面不同,深拷貝就是建立乙個新的和原始欄位的內容相同...
深拷貝和淺拷貝的區別
淺拷貝,即在定義乙個類 a,使用類似 a obj a obj1 obj 或者a obj1 obj 時候,由於沒有自定義拷貝建構函式,c 編譯器自動會產生乙個預設的拷貝建構函式。這個預設的拷貝建構函式採用的是 位拷貝 淺拷貝 而非 值拷貝 深拷貝 的方式,如果類中含有指標變數,預設的拷貝建構函式必定出...