我想允许我的类对象的深层副本,并且我正在尝试实现copyWithZone,但调用[super copyWithZone:zone]
会产生错误:
error: no visible @interface for 'NSObject' declares the selector 'copyWithZone:'
@interface MyCustomClass : NSObject
@end
@implementation MyCustomClass
- (id)copyWithZone:(NSZone *)zone
{
// The following produces an error
MyCustomClass *result = [super copyWithZone:zone];
// copying data
return result;
}
@end
我该如何创建此类的深层副本?
答案 0 :(得分:9)
您应该将NSCopying
协议添加到您班级的界面。
@interface MyCustomClass : NSObject <NSCopying>
然后方法应该是:
- (id)copyWithZone:(NSZone *)zone {
MyCustomClass *result = [[[self class] allocWithZone:zone] init];
// If your class has any properties then do
result.someProperty = self.someProperty;
return result;
}
NSObject
不符合NSCopying
协议。这就是您无法拨打super copyWithZone:
。
编辑:根据Roger的评论,我更新了copyWithZone:
方法中的第一行代码。但根据其他评论,可以安全地忽略该区域。