gpt4 book ai didi

objective-c - 使 NSInvocation 调用特定的 IMP

转载 作者:太空狗 更新时间:2023-10-30 03:26:03 39 4
gpt4 key购买 nike

我正在寻找一种方法让 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 上测试它。

最佳答案

NSInvocation 只是消息发送的对象表示。因此,它不能像普通消息发送那样调用特定的 IMP。为了让调用调用特定的 IMP,您需要编写一个自定义的 NSInvocation 类来执行 IMP 调用例程,或者您必须编写一个实现该行为的蹦床,然后创建一个调用来表示给 trampoline 的消息(即你基本上不会为任何事情使用 NSInvocation)。

关于objective-c - 使 NSInvocation 调用特定的 IMP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5049192/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com