我在库中有一个方法,如下所示:
- (id)initWithSomeObjects:(NSString *)something, ... NS_REQUIRES_NIL_TERMINATION;
我真的很想用数组而不是 var args 来调用它,因为我想传入的对象数量是可变的。
有没有什么方法,使用performSelector或NSInitation或objc_msgSend或其他什么,我可以调用var args方法,参数来自数组?
没有简单的方法可以做到这一点,因为如何传递参数涉及特定系统调用 ABI 的丑陋细节,并且您必须知道例如有多少个参数被放入寄存器,如何处理剩余的参数等等。这会涉及到汇编,不能用通用的方式来完成。
一般来说,任何具有像这样采用可变参数的方法或函数的 API,也会
- 提供另一种方法,该方法需要
va_list
参数代替(例如-[NSString initWithFormat:]
has -[NSString initWithFormat:arguments:]
)。如果是这种情况,那么您可以使用该技术来构造va_list
来自您在评论中链接到的文章。 (甚至构建va_list
是系统特定的且不可移植的。但至少它可以在 Mac 和 iPhone 上运行,而且做起来相当简单,而且不涉及组装。)
- 提供另一种方法,该方法需要
NSArray *
或 C 元素数组(例如-[NSArray initWithObjects:]
has -[NSArray initWithObjects:count:]
)
- 具有逐个添加元素的方法,这样整体效果与将它们全部传递给 varargs 方法相同(例如,末尾的 varargs 按钮标题
-[UIAlertView initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:]
可以通过调用来实现-[UIAlertView addButtonWithTitle:]
多次)。
如果您的 varargs API 没有上述之一,那么它就是一个设计糟糕的 API,您应该向编写它的人抱怨。如果你真的遇到这种情况,我猜测可以使用像 libffi 这样的东西,它允许你动态地进行函数调用,并处理依赖于系统的调用机制的细节。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)