3

ファサード クラスを介してクラス メソッドを転送するのに苦労しています。

明確にするために、次のすべてのメソッドをオーバーライドしています。

-(NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
-(void)forwardInvocation:(NSInvocation *)anInvocation
+(BOOL)instancesRespondToSelector:(SEL)aSelector
+(NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)aSelector
+(IMP)instanceMethodForSelector:(SEL)aSelector
+(BOOL)resolveClassMethod:(SEL)sel
+(BOOL)resolveInstanceMethod:(SEL)sel

.. それでも、クラス メソッドの場合、呼び出されるのは+resolveClassMethod. そこから、YES を返すか NO を返すかに関係なく、すぐに認識されないセレクター例外が発生します。

どうしたの?
クラス メッセージ転送は、インスタンス メッセージ転送とは異なる動作をしますか? 同様に、クラス メソッド
がないのはなぜですか。+forwardInvocation

どんな助けでも大歓迎です。

4

1 に答える 1

6

したがって、オブジェクトforwardInvocationにインスタンスメソッドを実行させるには、インスタンスメソッドを実装する必要が-forwardInvocation:あることをすでに知っています-methodSignatureForSelector:(他のメソッドは不要です)。クラス メソッドは、クラス オブジェクトの単なるメソッドです。クラスはオブジェクトであり、他のオブジェクトと同様に機能し、ルート クラス (NSObjectこの場合) のすべてのインスタンス メソッドをサポートします。

Objective-C ランタイムは、オブジェクトがクラス オブジェクトか非クラス オブジェクトかを気にしません。メッセージ転送メカニズムは同じです。したがって、オブジェクトにメッセージを送信すると、それが何であれ、それが見つからない場合、オブジェクトのメソッドforwardInvocation:methodSignatureForSelector:メソッドを探すだけです。したがって、クラス オブジェクトにこれらのメソッドが必要です。

つまり、クラス メソッド+forwardInvocation:を実装し、+methodSignatureForSelector:

于 2012-12-14T06:47:31.207 に答える