具有未知数量参数的resolveInstanceMethod

Jas*_*ues 3 objective-c objective-c-runtime

语境:

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

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

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

[assembly dangerousEnemyWithWeapon:id<BigGun>]
Run Code Online (Sandbox Code Playgroud)

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

问题:

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

我想打包这些论点,并将它们转发给另一个响应者.

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

Ken*_*ses 5

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

如果您实现-forwardInvocation:-methodSignatureForSelector:,然后你会得到一个NSInvocation对象.那已经是参数(和返回值)的包装.您可以按原样使用它,也可以查询它以解压缩参数并按照您的需要重新打包它们.

  • 除了NSInvocation之外,打包任意参数的唯一方法是编写汇编代码.它不漂亮. (2认同)