zoukankan      html  css  js  c++  java
  • NSCopying和NSMutableCopying协议

    NSCopying

    NSCopying是一个与对象拷贝有关的协议。如果想让一个类的对象支持拷贝,就需要让该类实现NSCopying协议。NSCopying协议中的声明的方法只有一个- (id)copyWithZone:(NSZone *)zone。当我们的类实现了NSCopying协议,通过类的对象调用copy方法时,copy方法就会去调用我们实现的- (id)copyWithZone:(NSZone *)zone方法,实现拷贝功能。实现代码如下所示:

    - (id)copyWithZone:(NSZone *)zone{    
            PersonModel *model = [[[self class] allocWithZone:zone] init];
            model.firstName = self.firstName;
            model.lastName  = self.lastName;
            //未公开的成员
         model->_nickName = _nickName;
         return model;
    }

    说明:在- (id)copyWithZone:(NSZone *)zone方法中,一定要通过[self class]方法返回的对象调用allocWithZone:方法。因为指针可能实际指向的是PersonModel的子类。这种情况下,通过调用[self class],就可以返回正确的类的类型对象。

    NSMutableCopying

    NSCopying协议与NSMutableCopying的区别主要是在于,返回的对象是否是可变类型的。以Foundation框架的NSArray为例

    NSArray *nameArray = @[@"Jim", @"Tom", @"David"];
    NSArray *copyArray = [nameArray copy];
    NSMutableArray *mutableCopyArray = [nameArray mutableCopy];
    [mutableCopyArray addObject:@"Sam"];

    NSArray对象调用copy方法时,copy方法会调用- (id)copyWithZone:(NSZone *)zone,得到对象的一份拷贝,但得到的对象还是不可变的对象。而NSArray对象调用mutableCopy方法时,mutableCopy方法会调用- (id)mutableCopyWithZone:(NSZone *)zone,得到可变的对象。

    所以,如果自定义类具有可变和不可变的区别,想让它支持拷贝时,就需要同时实现NSCopyingNSMutableCopying,在- (id)copyWithZone:(NSZone *)zone返回的是不可变对象,在- (id)mutableCopyWithZone:(NSZone *)zone返回的是可变对象。

    在拷贝对象时,需要注意拷贝执行的是浅拷贝还是深拷贝。深拷贝在拷贝对象时,会将对象的底层数据也进行了拷贝。Foundation框架中提供的所有集合,默认提供的都是浅拷贝。以上面的代码为例,对nameArray执行copy时,得到一个新的数组对象。但是新对象中存放的字符串和nameArray中存放的都是同一个字符串;若执行的是深拷贝,就会对nameArray中的所有字符串执行copy操作,然后再加入到新的对象中。



    文/黄龙辉(简书作者)
    原文链接:http://www.jianshu.com/p/f84803356cbb
    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
  • 相关阅读:
    java中的 equals 与 ==
    String类的内存分配
    SVN用命令行更换本地副本IP地址
    npoi 设置单元格格式
    net core 微服务框架 Viper 调用链路追踪
    打不死的小强 .net core 微服务 快速开发框架 Viper 限流
    net core 微服务 快速开发框架 Viper 初体验20201017
    Anno 框架 增加缓存、限流策略、事件总线、支持 thrift grpc 作为底层传输
    net core 微服务 快速开发框架
    Viper 微服务框架 编写一个hello world 插件02
  • 原文地址:https://www.cnblogs.com/iOSJason/p/5605429.html
Copyright © 2011-2022 走看看