NSCodingプロトコルの汎用実装を作成しようとしています。コードは、NSCodingを実装するマクロにラップされます。プロトコルを実装するには、次の2つの関数が必要です。
-(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;
}
問題のある行は、スーパーがNSCodingを実装していないクラスでを使用するとself = [super initWithCoder:coder];
、スーパーが応答しないため、コンパイルされないことです。initWithCoder:
スーパーをキャストするNSObject<NSCoding>*
と、LLVMコンパイラでは機能しません。
[super performSelector:(initWithCoder:) withObject:coder]
super == selfであるため、どちらも機能しません。これにより、無限ループが発生します。
[super initWithCoder:coder]
スーパークラスの関数をトリガーし、コンパイルの警告/エラーを生成しない方法で呼び出すにはどうすればよいですか?