我正在寻找一种方法来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
}
我已经验证了正确的 self 和正确的 IMP 在 JMP 之前都是正确的,并且_cmd
参数也正确输入。(换句话说,我正确地添加了这个方法)。
然而,事情正在发生。我有时会发现自己跳到一个方法(通常不是正确的方法)与一个 nilself
和_cmd
. 其他时候,我会用 EXC_BAD_ACCESS 在不知名的地方崩溃。想法?(自从我在汇编中做任何事情以来已经很长时间了......)我正在 x86_64 上测试它。