いくつかのクラスメソッド呼び出しをいくつかの「静的」クラスに転送したいファサードシングルトンがあります。
一見、forwardInvocation:
可能な解決策のように見えましたが、は、クラス自体ではなく、インスタンスへのポインタNSInvocation
のみinvokeWithTarget:
をsetTarget:
受け入れます。id
ターゲットとして引き渡そうとしましたが、どこか[MyTargetClass class]
を呼び出すと「既知のクラスメソッドがありません[...]」というエラーが発生します。[Facade someForwardedMethod]
電話をかける[[Facade sharedInstance] someForwardedMethod]
と、「表示されない@interface[...]がセレクター[...]を宣言します」というエラーが表示されます。
もちろん、respondsToSelector:
とをオーバーライドする必要があることも認識しているmethodSignatureForSelector:
ので、コードは次のようになります。
- (BOOL)respondsToSelector:(SEL)aSelector {
if ([super respondsToSelector:aSelector]) {
return YES;
} else {
return [MyTargetClass respondsToSelector:aSelector];
}
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector {
NSMethodSignature* signature = [super methodSignatureForSelector:selector];
if (!signature) {
signature = [MyTargetClass methodSignatureForSelector:selector];
}
return signature;
}
- (void)forwardInvocation:(NSInvocation *)anInvocation {
SEL aSelector = [anInvocation selector];
if ([MyTargetClass respondsToSelector: aSelector]) {
[anInvocation invokeWithTarget:[MyTargetClass class]];
} else {
[super forwardInvocation:anInvocation];
}
}
これを機能させる方法はありますか、それとも別のアプローチを選択する必要がありますか?
編集:私はロブ・ネピアが彼の答えで言及している両方の方法を試しました、ここに私の発見があります:
ファサードインスタンスを介してターゲットクラスのクラスメソッドを呼び出すことができます。
[(id)[Facade sharedInstance] doSomethingClassyInTargetClass];
思ったより少し醜いですが、うまくいきます。ただし、ファサードクラスをアドレス指定するときに、ターゲットクラスのクラスメソッドを呼び出すことができません。コンパイラを静かにするために私は書くことができます
[(Class)[Facade class] doSomethingClassyInTargetClass];
ただし、実行時に「NSInvalidArgumentException」「[FacadedoSomethingClassyInTargetClass]:認識されないセレクターがクラス[...]に送信されました」をスローします。どうやらファサードクラスのクラスメソッドは、を尊重せずに解決されるようですforwardInvocation:
が、結局のところ、それは-
前にあります...