我正在尝试为 NSCoding 协议创建一个通用实现。代码将被包裹在一个宏中,该宏将实现 NSCoding。为了实现协议,我们需要两个函数:
-(void)encodeWithCoder:(NSCoder*)coder;
-(id)initWithCoder:(NSCoder*)coder;
initWithCoder 函数的通用实现是:
-(id)initWithCoder:(NSCoder*)coder {
if ([super conformsToProtocol:@protocol(NSCoding)])
self = [super initWithCoder:coder];
else {
self = [super init];
}
if (!self) return self;
self = [MyGenericCoder initWithCoder:coder forObject:self withClass:[__clazz class]];
return self;
}
有问题的行是self = [super initWithCoder:coder];
它不会编译,因为initWithCoder:
当我们在一个它的 super 没有实现 NSCoding 的类中使用时 super 没有响应。将 super 转换为NSObject<NSCoding>*
不适用于 LLVM 编译器。
[super performSelector:(initWithCoder:) withObject:coder]
由于 super == self 也不起作用,这将导致无限循环。
如何[super initWithCoder:coder]
以触发超类中的函数并且不会生成编译警告/错误的方式调用?