如何从被调用的方法实现中创建NSInvocation?
我有一个功能,看起来像这样:如何从被调用的方法实现中创建NSInvocation?
void myMethodImpl(id self, SEL _cmd, ...)
我用这个作为一个类的方法的实现
class_addMethod(aClass, aSelector, (IMP)myMethodImpl, types);
所以myMethodImpl
获取的,当消息被发送到ACLASS与选择叫aSelector。现在我想创建一个NSInvocation,其中包含所有参数myMethodImpl
。
是否有一种简单的方法来创建一个NSInvocation从参数列表或我必须检查每个元素的类型并相应地添加它?
由于您正在向班级添加方法,为什么不添加/ swizzle forwardInvocation:
而不是?此时,运行时将很好地为您构建一个调用。
这是不可能的。一个简单的谷歌搜索显示的这篇文章:
http://www.wincent.com/a/about/wincent/weblog/archives/2006/03/nsinvocation_an.php
其中明确说明如何va_args
不正确地NSInvocation的工作。
行动选择器实现功能好,但那么如何调用'forwardInvocation:'方法内部工作?因为据我所知,这个方法的调用必须这样做。 – V1ru8 2011-12-23 15:26:27
我看不到'-forwardInvocation:'在任何地方被调用,无论我传递给NSArray的选择器是什么......以及来自文档的 '被转发的消息必须有固定数量的参数;不支持可变数量的参数(采用printf()的样式)。' – 2011-12-23 15:45:38
我不想用arg列表调用一个方法,我只是想用一个va_args列表来调用一个具有固定编号的方法ARGS。但它看起来像我必须处理所有的'NSMethodSignature getArgumentTypeAtIndex:'东西来得到这个工作。 – V1ru8 2011-12-23 16:18:30
确实有可能。看看
http://overooped.com/post/913725384/nsinvocation – epatel 2011-12-23 21:44:41