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同理。
网友评论