如何从被调用的方法实现中创建NSInvocation?

问题描述:

我有一个功能,看起来像这样:如何从被调用的方法实现中创建NSInvocation?

void myMethodImpl(id self, SEL _cmd, ...) 

我用这个作为一个类的方法的实现

class_addMethod(aClass, aSelector, (IMP)myMethodImpl, types); 

所以myMethodImpl获取的,当消息被发送到ACLASS与选择叫aSelector。现在我想创建一个NSInvocation,其中包含所有参数myMethodImpl

是否有一种简单的方法来创建一个NSInvocation从参数列表或我必须检查每个元素的类型并相应地添加它?

由于您正在向班级添加方法,为什么不添加/ swizzle forwardInvocation:而不是?此时,运行时将很好地为您构建一个调用。

+0

http://overooped.com/post/913725384/nsinvocation – epatel 2011-12-23 21:44:41

这是不可能的。一个简单的谷歌搜索显示的这篇文章:

http://www.wincent.com/a/about/wincent/weblog/archives/2006/03/nsinvocation_an.php

其中明确说明如何va_args不正确地NSInvocation的工作。

+0

行动选择器实现功能好,但那么如何调用'forwardInvocation:'方法内部工作?因为据我所知,这个方法的调用必须这样做。 – V1ru8 2011-12-23 15:26:27

+0

我看不到'-forwardInvocation:'在任何地方被调用,无论我传递给NSArray的选择器是什么......以及来自文档的 '被转发的消息必须有固定数量的参数;不支持可变数量的参数(采用printf()的样式)。' – 2011-12-23 15:45:38

+0

我不想用arg列表调用一个方法,我只是想用一个va_args列表来调用一个具有固定编号的方法ARGS。但它看起来像我必须处理所有的'NSMethodSignature getArgumentTypeAtIndex:'东西来得到这个工作。 – V1ru8 2011-12-23 16:18:30

确实有可能。看看