只复制对象的指针称为浅复制;复制具有新的内存空间的对象则称为深复制。
NSObject中有copy方法,它能够通过复制接收器来生成新实例。但是,实际的复制操作并不是由copy完成的,而是由实例方法copyWithZone:完成的。发送copy消息给实例对象后,指定参数为NULL,这样就可以调用自身的copyWithZone:。该方法就是这样生成新的实例的。
copyWithZone:是在协议NSCopying中声明的:
@protocol NSCopying
-(id)copyWithZone:(nullable NSZone *)zone;
@end
NSCopying协议在头文件Foundation/NSObject.h中定义,但是NSObject自己并不采用该协议。
因此,为了使实例能够复制,就需要在类中采用NSCopying协议,并实现copyWithZone:方法。
如
-(id)copyWithZone:(NSZone *)zone {
YYImageFrame *frame = [self.class new];
frame.index = _index;
frame.width = _width;
frame.height = _height;
frame.offsetX = _offsetX;
frame.offsetY = _offsetY;
frame.duration = _duration;
frame.dispose = _dispose;
frame.blend = _blend;
frame.image = _image.copy;
return frame;
}
考虑到继承的原因,使子类调用[super copyWithZone:zone];能够返回子类的实例,所以不建议写[类名 new],而是使用[self class]。
网友评论