想要让自己写的对象具有copy功能,需要实现NSCopying协议。copy分深拷贝与浅拷贝,深拷贝可以理解为:在拷贝自身的时候,把底层的数据也复制出去。浅拷贝拷贝之后的对象实际上是跟原对象同一地址。(Foundation框架中的所有collection类在默认情况下都执行浅拷贝)
所以NSMutableArray最简单的初始化方法可以这样写:
NSMutableArray *array = [@[] mutableCopy];
要覆写copy方法,其实真正需要实现的是copyWithZone:
,所以想要让自己写的对象支持copy功能,只需要声明model遵从NSCopying协议,并实现该方法。
<NSCopying>
协议中只有一个方法:
- (id)copyWithZone:(NSZone *)zone
其中的zone参数在以前开发时内存会分为不同的zone,对象创建在zone里面,但是现在只有一个default zone,所以并不需要管这个参数。
这是我在开发中深拷贝的一个使用场景:
self.interimModel = self.currentModel;
这一句代码是将currentModel
赋值给interimModel
,其实本质上是currentModel的指针地址丢给了interimModel,在操作interimModel内部的值的时候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];
网友评论