我想为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()”。AFAIK 这在 C 中是不可能的。
我想到的另一个解决方案是通过方法调配来做一些魔术。
在步骤:
- 创建一个“swizzle 方法”,它只调用我的自定义代码,然后调用原始方法(通过命名模式)
- 使用“swizzle Method”之一更改每个函数的 IMP
- 使用“旧”实现创建一个新方法,并将名称更改为类似于“___name”的模式
在这个解决方案中,我被困在第 3 点。我还没有设法动态创建一个完整的新方法。
有没有人可以帮助我解决上面的问题,或者有另一种“捕获所有方法功能”的解决方案。
最好的是类似 forwardInvocation 的东西,它也捕获已经定义的函数。
谢谢你的帮助!