Obj-C的copy

      iOS中若是想複製一個對象可使用copy成員方法或者mutablecopy方法,這兩個方法是NSObject類的成員方法。這兩個方法在使用中是有所區別的。 函數

      若是要複製一個NSArray對象,若是使用copy方法,則拷貝出一個NSArray對象,若是使用mutablecopy則複製出一 個NSMutableArray對象。copy老是拷貝出一個不可變的對象,而mutablecopy老是拷貝出可變的對象。 spa

      若是是不可變對象調用copy方法,則拷貝出的對象也是不可變的,所以iOS規定:這種狀況下的對象不進行復制,而是僅僅是多了一個指向這個對象的指針,對象的引用計數+1.這種狀況叫作淺複製。 指針

      其餘的狀況,例如可變複製爲可變可變複製爲不可變不可變複製爲可變的狀況都是將源對象複製一個副本,這個副本可變不可變由調用的方法決定。這種狀況叫作深複製。 對象

      全部的系統類對象均可以進行copy或者mutablecopy,並且不用去手動實現這兩個方法。 但若是自定義類也要進行復制,這時候咱們就要對自定義的對象進行copy或者mutablecopy操做,而這個時候咱們就須要手動實現這兩個方 法。 繼承

      讓自定義類可以實現copy方法,須要讓自定義的類實現<copying>協議,固然若是想使用mutablecopy方法則須要 實現<mutablecopying>協議。copying協議中只有一個函數,就是copyWithZone方法。須要在本身定義的類的實現文件中重寫這個方法,自定義類爲:Student,它含有一個name屬性: 內存

- (id)copyWithZone:(NSZone *)zone { it

    Student * stu = [ [ [ self class ] allocWithZone : zone ] init ] ; table

    stu . name = self . name ; class

    return stu ; 引用

}

allocWithZone:方法的調用者不是Student而是[self class]。

      若是寫具體的類名,即Student,則此處就會開闢Student對象的內存,而若是還有別的類繼承這個類,例如又進一步延伸出一個類叫作GoodStudent類繼承Student類,那麼在複製GoodStudent的時候首先調用父類的方法,則父類方法建立了一個 Student,這時候子類比父類多出來的一些屬性就不能使用了,由於建立的是一個父類而不是子類,父類不能識別子類獨有的屬性。改成self class則當子類調用這個方法的時候,self是子類自己,這時候建立出的對象是子類對象,就能夠識別子類的屬性了。

相關文章
相關標籤/搜索