objective-cは存在しないクラスメソッドの呼び出しを傍受する方法を提供していますか?Objective Cのクラスと魔法のメソッド
9
A
答えて
2
はい、あなたはresolveClassMethodとすることができます(NSObjectの上で定義された)クラスメソッド:
ここでは、またに注意するものである(私の最初の時間を困惑):http://iphonedevelopment.blogspot.com/2008/08/dynamically-adding-class-objects.html
5
forwardInvocation
メソッドは、あなたが使いたいものです。存在しないセレクターがオブジェクトに対して呼び出されると、自動的に呼び出されます。このメソッドのデフォルトの振る舞いは、doesNotRecognizeSelector:
(コンソールにデバッグ情報を出力するもの)を呼び出すことですが、任意の操作を上書きすることができます。 Appleが推奨するアプローチの1つは、このメソッドにメソッド呼び出しを別のオブジェクトに転送させることです。
- (void)forwardInvocation:(NSInvocation *)anInvocation
forwardInvocation
は、かなり高価な操作です。 NSInvocationオブジェクトは、フレームワークによって作成される必要があり、(オプションで)別のインスタンスのセレクタを呼び出すために使用される必要があります。存在しないセレクタを検出する(比較的)高速な方法を探している場合は、代わりにforwardingTargetForSelector
を実装することができます。
- (id)forwardingTargetForSelector:(SEL)aSelector
あなたは、不足しているセレクタを持つことになり、同じオブジェクトにforwardInvocation
メソッドをオーバーライドする場合は特に、に注意するためにいくつかの落とし穴年代には、効果的にこれらのメソッドをオーバーライドする方法についてはApple's documentationがあるはずです。
関連する問題
- 1. Objective-C:クラスとインスタンスのメソッド? Objective-Cで
- 2. Objective-cクラスの作成メソッド
- 3. objective-cクラスのinitメソッドのメモリリーク
- 4. C#とObjective Cクラス
- 5. C++メソッドのメッセージングObjective-Cメソッド?
- 6. Pythonの特殊(魔法)メソッド
- 7. objective-cクラスのクラスのテスト
- 8. Objective C +(id)のメソッド
- 9. セレクタエラーObjective-Cのメソッド
- 10. のObjective-Cメソッド「:」プロトコル
- 11. Objective-CクラスのinitWithDelegate
- 12. Objective-Cのメソッドとブロックの相違
- 13. のObjective-Cメソッドの構文
- 14. SwiftのObjective-Cメソッドのパラメータ
- 15. Objective-Cでのメソッドのオーバーライド
- 16. Objective-C:クラス間の通信方法
- 17. C#デバッグ:魔法のシステムクロックリストア
- 18. sortUsingFunctionと私のObjective Cのクラスで
- 19. Objective-CのSwiftクラスとEnumの使用
- 20. のObjective-Cクラスのメソッドのローカル変数「自己」
- 21. Objective-Cクラスのインスタンス変数としてのC++クラス
- 22. パラメータとしてのObjective-C渡しメソッド
- 23. Objective Cのクラスのグローバルインスタンス
- 24. 親クラスメソッドからの子クラスの呼び出しメソッド(Objective-c 2.0)
- 25. Objective Cのメソッド構文
- 26. objective-c:関数/メソッドのオーバーロード?
- 27. objective-Cのカスタムinitメソッド
- 28. メソッドObjective Cの継承
- 29. Objective-Cの非仮想メソッド
- 30. Swift 1.2 to swift 2:Objective Cメソッドとオプションのメソッドとの競合
クラスメソッド転送メカニズムでは、インスタンスメソッドではなくクラスメソッドが必要です。 '+(ボイド)forwardingTargetForSelector:(SEL)SEL; ' ' +(ボイド)forwardInvocation:(NSInvocation *)anInvocation;' 後関数が支持機能使用: '+(NSMethodSignature *)methodSignatureForSelectorを:(SEL )sel; ' – dmitri