iOS NSCopying 与 NSMutableCopying

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同理。

推荐阅读更多精彩内容