将变量参数列表从Objective-C方法传递到C函数

将变量参数列表从Objective-C方法传递到C函数,objective-c,wrapper,objective-c-runtime,variadic-functions,Objective C,Wrapper,Objective C Runtime,Variadic Functions,我想为一些Objective-C运行时方法创建一个包装类,以便于测试(stubing等),我想知道如何处理变量参数从Objective-C方法传递到C函数的过程 例如,我想用以下函数签名包装一个C函数: id objc_msgSend(id theReceiver, SEL theSelector, ...) 我知道我可以在Objective-C方法中使用“…”运算符,但如何将其传递给C函数 - (id)msgSend:(id)theReceiver selector:(SEL)theSele

我想为一些Objective-C运行时方法创建一个包装类,以便于测试(stubing等),我想知道如何处理变量参数从Objective-C方法传递到C函数的过程

例如,我想用以下函数签名包装一个C函数:

id objc_msgSend(id theReceiver, SEL theSelector, ...)
我知道我可以在Objective-C方法中使用“…”运算符,但如何将其传递给C函数

- (id)msgSend:(id)theReceiver selector:(SEL)theSelector, ...
{
    return objc_msgSend(theReceiver, theSelector, ...) // <-- how to pass variable arguments?
}
-(id)msgSend:(id)接收器选择器:(SEL)选择器。。。
{

返回objc_msgSend(接收者、选择器等)/您不能。可变参数不能向下传递。您可以做的最接近的事情是查找函数的变体,该变体采用
va_列表
而不是可变参数,然后初始化
va_列表
,并将其传递给函数

回到过去,
objc\u msgSend()
有一个名为
objc\u msgSendv()
的配套函数。从那时起,它就被弃用并删除了。但是有了这个函数,您可以做到:

- (id)sendMessageTo:(id)selfish selector:(SEL)sel, ...
{
    va_list args;
    va_start(args, sel);
    id retVal = objc_msgSendv(selfish, sel, args);
    va_end args;
    return retVal;
}

纯C无法做到这一点。但出于此目的,苹果也使用了(或已经使用过)纯C作为语言桥接。我在我的AOP框架中使用了它。它工作得非常好。

副本询问变量参数列表的方法到方法传递,但答案也适用于这个问题。而这个问题“类似”对于另一个问题,我不同意它是“重复的”。糟糕的是,这将是我在上个月左右遇到的第二个被弃用的有用函数。@5StringRyan是的,太糟糕了,苹果删除了它:(它没有那么有用,因为它只适用于最初声明为可变的方法,这是非常少的。也就是说,您不能将其用作通用转发机制。