Objective-C でオブジェクト用の小さなプラグイン システムを構築したいと考えています。
今、オブジェクトで利用可能なすべての関数にコード行を動的に (実行時に) 追加したいところに行き詰まっています。
ランタイム ライブラリをいじってみましたが、まだ解決策がありません。
これまでに試したことは次のとおりです。
id (^impyBlock)(id, id, ... ) = ^(id self_, id arguments, ...)
{
// My custom code for every function here
id (*func)(__strong id,SEL,...) = (id (*)(__strong id, SEL, ...))imp;
return func(obj, s, arguments);
};
id (*impyFunct)(id, SEL,...) = imp_implementationWithBlock(impyBlock);
method_setImplementation(mList[i], impyFunct);
私の問題は、複数の引数がある場合、それらを「func()」に渡す機会がないことです。私の知る限り、これはCでは不可能です。
私が考えたもう1つの解決策は、メソッドのスウィズリングで魔法を行うことです。
手順:
- カスタムコードを呼び出し、その後元のメソッドを呼び出す「スウィズルメソッド」を作成します(ネーミングスキーマによって)
- 「swizzle Method」のいずれかを使用して、すべての関数の IMP を変更します
- 「古い」実装で新しいメソッドを作成し、名前を「___name」のようなスキーマに変更します
このソリューションでは、ポイント 3 で行き詰まっています。完全な新しいメソッドを動的に作成することができませんでした。
上記の問題を解決できる人はいますか、または「すべてのメソッド機能をキャッチする」ための別の解決策がありますか。
最善の方法は、すでに定義されている関数もキャッチする forwardInvocation のようなものです。
ご協力いただきありがとうございます!