【发布时间】:2011-02-19 06:04:56
【问题描述】:
我正在寻找一种方法来使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 参数也正确输入。 (也就是说,我正确地添加了这个方法)。
但是,有些事情正在发生。我有时会发现自己跳到一个方法(通常不是正确的方法),self 和 _cmd 为零。其他时候,我会用 EXC_BAD_ACCESS 在不知名的地方崩溃。想法? (我已经很久没有在汇编中做过任何事情了......)我正在 x86_64 上测试它。
【问题讨论】:
标签: objective-c nsinvocation imp