gpt4 book ai didi

objective-c - 如何将数组传递给需要 var args 的 objc 方法(例如 ...')

转载 作者:搜寻专家 更新时间:2023-10-30 20:02:53 25 4
gpt4 key购买 nike

我在库中有一个看起来像这样的方法:

- (id)initWithSomeObjects:(NSString *)something, ... NS_REQUIRES_NIL_TERMINATION;

我真的很想用数组而不是 var args 来调用它,因为我想传入的对象数量是可变的。

有没有什么方法,使用 performSelector 或 NSInvocation 或 objc_msgSend 或其他什么,我可以调用 var args 方法,参数来自数组?

最佳答案

没有简单的方法可以做到这一点,因为如何传递参数会涉及特定系统调用 ABI 的丑陋细节,并且您必须知道例如有多少参数放入寄存器,如何处理剩余的参数等等,这会涉及到汇编,一般的方式是做不到的。

通常,任何具有采用这种可变参数的方法或函数的 API,也将是

  1. 提供另一种采用 va_list 参数的方法(例如 -[NSString initWithFormat:]-[NSString initWithFormat:arguments:] ).如果是这种情况,那么您可以使用该技术从您在评论中链接到的文章构建 va_list。 (即使构建 va_list 也是特定于系统且不可移植的。但至少它可以在 Mac 和 iPhone 上运行,而且操作起来相当简单,不涉及汇编。)
  2. 提供另一种接受 NSArray * 或 C 元素数组的方法(例如 -[NSArray initWithObjects:]-[NSArray initWithObjects:count: ])
  3. 有一个一个地添加元素的方法,使得整体效果与将它们一起传递给可变参数方法相同(例如 -[UIAlertView initWithTitle:message:delegate: cancelButtonTitle:otherButtonTitles:]可以通过多次调用-[UIAlertView addButtonWithTitle:]来实现。

如果您的可变参数 API 没有上述任何一项,那么它就是一个设计糟糕的 API,您应该向编写它的人投诉。如果你真的遇到这种情况,我猜你可以使用像 libffi 这样的东西,它允许你动态地进行函数调用,并处理依赖于系统的调用机制的细节。

关于objective-c - 如何将数组传递给需要 var args 的 objc 方法(例如 ...'),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17689616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com