NSInvocation
特定の呼び出しを行う方法を探していIMP
ます。デフォルトでは、IMP
見つけることができる「最も低い」もの(つまり、最近オーバーライドされたバージョン)を呼び出しますIMP
が、継承チェーンの上位から呼び出す方法を探しています。IMP
呼び出したいものは動的に決定されます。それ以外の場合は、キーワードなどを使用できますsuper
。
私の考えは、-forwardInvocation:
メカニズムを使用してメッセージをキャプチャし (簡単で既に機能している)、それを変更して、実装でも最も遠い子孫の実装でもIMP
ないメソッドに移動することでした。super
(難しい)
私が見つけた唯一のものはAspectObjectiveCですが、これには libffi が必要であるため、iOS とは互換性がありません。理想的には、これをクロスプラットフォームにしたいと思います。
何か案は?
免責事項:私はちょうど実験しています
@bbum のトランポリン機能のアイデアを試す
それで、私は物事をほとんどセットアップしたと思います。を介して正しく追加される次のトランポリンがclass_addMethod()
あり、入力されます。
id dd_trampolineFunction(id self, SEL _cmd, ...) {
IMP imp = [self retrieveTheProperIMP];
self = [self retrieveTheProperSelfObject];
asm(
"jmp %0\n"
:
: "r" (imp)
);
return nil; //to shut up the compiler
}
JMPの前に適切な自己と適切なIMPの両方が正しいことを確認し、_cmd
パラメーターも適切に入っています。(つまり、このメソッドを正しく追加しました)。
しかし、何かが起こっています。nilself
と_cmd
. また、EXC_BAD_ACCESS で何もないところにクラッシュすることもあります。アイデア?(アセンブリで何かをしたのは久しぶりです...) x86_64でこれをテストしています。