想要讓自己寫的對象具有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];