2011-08-04 17 views

答えて

5

forwardInvocationメソッドは、あなたが使いたいものです。存在しないセレクターがオブジェクトに対して呼び出されると、自動的に呼び出されます。このメソッドのデフォルトの振る舞いは、doesNotRecognizeSelector:(コンソールにデバッグ情報を出力するもの)を呼び出すことですが、任意の操作を上書きすることができます。 Appleが推奨するアプローチの1つは、このメソッドにメソッド呼び出しを別のオブジェクトに転送させることです。

- (void)forwardInvocation:(NSInvocation *)anInvocation 

forwardInvocationは、かなり高価な操作です。 NSInvocationオブジェクトは、フレームワークによって作成される必要があり、(オプションで)別のインスタンスのセレクタを呼び出すために使用される必要があります。存在しないセレクタを検出する(比較的)高速な方法を探している場合は、代わりにforwardingTargetForSelectorを実装することができます。

- (id)forwardingTargetForSelector:(SEL)aSelector 

あなたは、不足しているセレクタを持つことになり、同じオブジェクトにforwardInvocationメソッドをオーバーライドする場合は特に、に注意するためにいくつかの落とし穴年代には、効果的にこれらのメソッドをオーバーライドする方法についてはApple's documentationがあるはずです。

+1

クラスメソッド転送メカニズムでは、インスタンスメソッドではなくクラスメソッドが必要です。 '+(ボイド)forwardingTargetForSelector:(SEL)SEL; ' ' +(ボイド)forwardInvocation:(NSInvocation *)anInvocation;' 後関数が支持機能使用: '+(NSMethodSignature *)methodSignatureForSelectorを:(SEL )sel; ' – dmitri

関連する問題