天天看點

iOS - OC Copy 拷貝前言1、系統的非容器類對象2、系統的容器類對象3、自定義對象

copy:需要先實作 NSCopying 協定,建立的是不可變副本。

mutableCopy:需要實作 NSMutableCopying 協定,建立的是可變副本。

淺拷貝:指針拷貝,源對象和副本指向的是同一個對象。對象的引用計數器 +1,其實相當于做了一次 retain 操作。

深拷貝:内容拷貝,源對象和副本指向的是兩個不同的對象。源對象引用計數器不變,副本計數器設定為 1。

隻有不可變對象建立不可變副本(copy)才是淺拷貝,其它都是深拷貝。

在 iOS 中并不是所有的對象都支援 copy,mutableCopy,遵守 NSCopying 協定的類可以發送 copy 消息,遵守 NSMutableCopying 協定的類才可以發送 mutableCopy 消息。假如發送了一個沒有遵守上 訴兩協定而發送 copy 或者 mutableCopy,那麼就會發生異常。但是預設的 iOS 類并沒有遵守這兩個協定。如果想自定義一下 copy 那麼就必須遵守 NSCopying,并且實作 copyWithZone: 方法,如果想自定義一下 mutableCopy 那麼就必須遵守 NSMutableCopying,并且實作 mutableCopyWithZone: 方法。

copy 是建立一個新對象,retain 是建立一個指針,引用對象計數加 1。copy 屬性表示兩個對象内容相同,新的對象 retain 為 1 ,與舊有對象的引用計數無關,舊有對象沒有變化。copy 減少對象對上下文的依賴。retain 屬性表示兩個對象位址相同(建立一個指針,指針拷貝),内容當然相同,這個對象的 retain 值 +1 也就是說,retain 是指針拷貝,copy 是内容拷貝。

需要自己要實作 NSCopying,NSMutableCopying 這樣就能調用 copy 和 mutablecopy 了。

繼續閱讀