NSCopying的理解

想要让自己写的对象具有copy功能,需要实现NSCopying协议。copy分深拷贝与浅拷贝,深拷贝可以理解为:在拷贝自身的时候,把底层的数据也复制出去。浅拷贝拷贝之后的对象实际上是跟原对象同一地址。(Foundation框架中的所有collection类在默认情况下都执行浅拷贝)

所以NSMutableArray最简单的初始化方法可以这样写:

NSMutableArray *array = [@[] mutableCopy];

要覆写copy方法,其实真正需要实现的是copyWithZone:,所以想要让自己写的对象支持copy功能,只需要声明model遵从NSCopying协议,并实现该方法。
协议中只有一个方法:

- (id)copyWithZone:(NSZone *)zone

其中的zone参数在以前开发时内存会分为不同的zone,对象创建在zone里面,但是现在只有一个default zone,所以并不需要管这个参数。

这是我在开发中深拷贝的一个使用场景:

self.interimModel = self.currentModel;

这一句代码是将currentModel赋值给interimModel,其实本质上是currentModel的指针地址丢给了interimModel,在操作interimModel内部的值的时候currentMode的值也会跟着改变。若是需求只需要改变interimModel的值,这时候可以使用深拷贝解决。

代码如下:

- (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];

你可能感兴趣的:(NSCopying的理解)