美文网首页
iOS NSCopying 与 NSMutableCopying

iOS NSCopying 与 NSMutableCopying

作者: iOS_肖晨 | 来源:发表于2018-03-01 09:39 被阅读67次

    NSCopying:

    如果要调用一个对象的copy方法,这个对象必须遵循NSCopying的协议。这个协议中规定了一个方法:
    - (id)copyWithZone:(nullable NSZone *)zone;
    我们就是通过实现这个方法给对象提供拷贝的功能。对于很多现有类,如NSString,NSDictionary,。。。这个方法已经实现。假设我们现在自定义了一个类,需要为这个类提供拷贝的功能,就需要自己来动手实现这个方法。

    - (id)copyWithZone:(NSZone *)zone {
        Person10 *p = [[[self class] allocWithZone:zone] init];
        p.name = [self.name mutableCopyWithZone:zone]; // 这是一个mutableCopy属性
        p.age = self.age;
        p->_height = _height; // 这是私有变量
        return p;
    }
    

    NSMutableCopying:

    如果要调用一个对象的mutableCopying方法,这个对象必须遵循NSMutableCopying的协议。这个协议中规定了一个方法:
    - (id)mutableCopyWithZone:(nullable NSZone *)zone;
    类似NSCopying,如果想要实现对象的mutableCopying,我们就需要实现这个方法。

    - (id)mutableCopyWithZone:(NSZone *)zone {
        Person10 *p = [[[self class] allocWithZone:zone] init];
        p.name = [self.name mutableCopyWithZone:zone];
        p.age = self.age;
        p->_height = _height;
        return p;
    }
    

    注意:

    • 1.类直接继承自NSObject,无需调用[super copyWithZone:zone]
    • 2.父类没有实现copy协议,子类实现了copy协议,子类无需调用[super copyWithZone:zone]
    • 3.父类实现了copy协议,子类需要调用[super copyWithZone:zone]
    • 4.copyWithZone方法中要调用[[[self class] allocWithZone:zone] init]来分配内存
      mutableCopy同理。

    相关文章

      网友评论

          本文标题:iOS NSCopying 与 NSMutableCopying

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