只復(fù)制對象的指針稱為淺復(fù)制脆侮;復(fù)制具有新的內(nèi)存空間的對象則稱為深復(fù)制蟀给。
NSObject中有copy方法黎做,它能夠通過復(fù)制接收器來生成新實例叉跛。但是,實際的復(fù)制操作并不是由copy完成的蒸殿,而是由實例方法copyWithZone:完成的筷厘。發(fā)送copy消息給實例對象后,指定參數(shù)為NULL伟桅,這樣就可以調(diào)用自身的copyWithZone:敞掘。該方法就是這樣生成新的實例的。
copyWithZone:是在協(xié)議NSCopying中聲明的:
@protocol NSCopying
-(id)copyWithZone:(nullable NSZone *)zone;
@end
NSCopying協(xié)議在頭文件Foundation/NSObject.h中定義楣铁,但是NSObject自己并不采用該協(xié)議玖雁。
因此,為了使實例能夠復(fù)制盖腕,就需要在類中采用NSCopying協(xié)議赫冬,并實現(xiàn)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;
}
考慮到繼承的原因溃列,使子類調(diào)用[super copyWithZone:zone];能夠返回子類的實例劲厌,所以不建議寫[類名 new],而是使用[self class]听隐。