NSCopying的理解

作者: makemake | 来源:发表于2017-11-05 20:32 被阅读40次

    想要让自己写的对象具有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];

    相关文章

      网友评论

        本文标题:NSCopying的理解

        本文链接:https://www.haomeiwen.com/subject/ebphmxtx.html