Objective-C为对象的每个方法添加function

我想为objective-c中的对象构建一个小插件系统。

现在我陷入了我想要动态地(在运行时)为对象中的每个可用function添加一行代码的地步。

我已经玩过运行时库,但还没有找到解决方案。

到目前为止我尝试过的是:

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中是不可能的。

我想到的另一个解决方案是通过方法调配来做一些魔术。

步骤:

  1. 创建一个“swizzle方法”,它只调用我的自定义代码并在之后调用原始方法(通过命名方案)
  2. 使用“swizzle Method”之一更改每个函数的IMP
  3. 使用“旧”实现创建一个新方法,并将名称更改为类似“___name”的模式

在这个解决方案中,我陷入了第3点。我还没有设法动态创建一个完整的新方法。

有没有人可以帮助我解决上面的问题,或者有一个“捕获所有方法function”的另一个解决方案。

最好的是类似forwardInvocation,它也捕获已经定义的函数。

谢谢你的帮助!

Lemme把这分为两部分,因为我无法理解你的两个问题。

I.使用“旧”实现创建一个新方法,并将名称更改为类似“___name”的模式

这很容易,虽然我不明白如何解决你的问题。 你仍然无法将可变参数函数参数传递给这样的方法(你是对的,不能在C中完成)。

 IMP swapImpForSelector(Class cls, SEL sel, IMP newImp) { Method m = class_getInstanceMethod(cls, sel); IMP oldImp = method_setImplementation(m, newImp); NSString *newSel = [NSString stringWithFormat:@"__prefixed_%@", NSStringFromSelector(sel)]; const char *type = method_getTypeEncoding(m); class_addMethod(cls, NSSelectorFromString(newSel), oldImp, type); return oldImp; } 

II。 如果要在函数之间传递可变参数,则可能需要回退到重组装hackage。 幸运的是,一些聪明人已经为你做了这件事。

使用NSInvocation类 ,或者如果它不够,那么libffi甚至更低级别。

为任意对象执行此操作将非常困难。 看看AspectCocoa的这些内容,但是你会发现它不能很好地工作,不建议在生产环境中使用。

但是对于一个插件系统,你最好只定义类似PluggableObject类的东西,它设计时考虑了扩展。 忘记在任意方法的中间运行任意块 – 而是定义可以插入内容的特定“套接字”以及这些东西可以遵循的接口以获得您想要支持的function。 它会更加稳定,更容易添加和修复。