具有未知数量参数的resolveInstanceMethod

时间:2013-08-16 05:53:06

标签: objective-c objective-c-runtime

上下文

我有一个依赖注入容器 - www.typhoonframework.org

它允许使用接口定义组件以在运行时解析它们 - 使用resolveInstanceMethod和implementntationWithBlock将请求拖拽到DI容器。

用户一直要求在运行时提供一些参数。例如:

[assembly dangerousEnemyWithWeapon:id<BigGun>]

。 。敌人是由DI容器中的合作类组装而成,但枪是在运行时提供的。 。

问题:

是否可以使用resolveInstanceMethod来定义预先知道参数数量的实现?

我想打包这些参数,并将它们转发给另一个响应者。

参数可以按顺序打包或添加到字典中,匹配的选择器部分作为键。

1 个答案:

答案 0 :(得分:5)

您不能使用+resolveInstanceMethod:,但可以使用传统转发功能。 +resolveInstanceMethod:只需使用Objective-C运行时在类上安装新的实例方法。你不会影响它的调用方式。它将像调用者提供的那样在寄存器和堆栈中使用参数的任何其他方法调用。您没有机会打包或编组参数。

如果您实施-forwardInvocation:-methodSignatureForSelector:,则会获得NSInvocation个对象。那已经是参数(和返回值)的包装。您可以按原样使用它,也可以查询它以解压缩参数并重新打包它们。