1

我想为一些 Objective-C 运行时方法创建一个包装类,以便于测试(存根等),并且我想知道如何处理从 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?
}
4

2 回答 2

2

你不能。可变参数不能被传递。您可以做的最接近的事情是寻找接受 ava_list而不是可变参数的函数的变体,然后初始化 ava_list并将其传递给函数。

早在过去,objc_msgSend()就有一个叫做objc_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;
}
于 2013-06-26T04:38:46.277 回答
1

你不能用纯 C做到这一点。但是为此目的存在libffi,它也被(或已经)被 Apple 用于语言桥接。我在我的 AOP 框架中使用了它。它工作得很好。

于 2013-06-26T07:23:00.720 回答