NSCopying的理解

想要讓自己寫的對象具有copy功能,需要實現(xiàn)NSCopying協(xié)議。copy分深拷貝與淺拷貝,深拷貝可以理解為:在拷貝自身的時候,把底層的數(shù)據(jù)也復(fù)制出去。淺拷貝拷貝之后的對象實際上是跟原對象同一地址。(Foundation框架中的所有collection類在默認情況下都執(zhí)行淺拷貝)

所以NSMutableArray最簡單的初始化方法可以這樣寫:

NSMutableArray *array = [@[] mutableCopy];

要覆寫copy方法,其實真正需要實現(xiàn)的是copyWithZone:,所以想要讓自己寫的對象支持copy功能,只需要聲明model遵從NSCopying協(xié)議,并實現(xiàn)該方法。
<NSCopying> 協(xié)議中只有一個方法:

- (id)copyWithZone:(NSZone *)zone

其中的zone參數(shù)在以前開發(fā)時內(nèi)存會分為不同的zone,對象創(chuàng)建在zone里面,但是現(xiàn)在只有一個default zone,所以并不需要管這個參數(shù)。

這是我在開發(fā)中深拷貝的一個使用場景:

self.interimModel = self.currentModel;

這一句代碼是將currentModel賦值給interimModel,其實本質(zhì)上是currentModel的指針地址丟給了interimModel,在操作interimModel內(nèi)部的值的時候currentMode的值也會跟著改變。若是需求只需要改變interimModel的值,這時候可以使用深拷貝解決。

代碼如下:
<NSCopying>

- (id)copyWithZone:(NSZone *)zone{
    WSTColorModel *model = [[WSTColorModel allocWithZone:zone]init];
    model.modelName = self.modelName;
    model.name= self.name;
    model.h= self.h;
    return model;
}

self.interimModel = [self.currentModel copy];

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容