Chr*_*ris 3 objective-c nsinvocation performselector objc-message-send
我在库中有一个看起来像这样的方法:
- (id)initWithSomeObjects:(NSString *)something, ... NS_REQUIRES_NIL_TERMINATION;
Run Code Online (Sandbox Code Playgroud)
我真的想用数组而不是var args来调用它,因为我想传入的对象数量是可以改变的.
有没有办法,使用performSelector或NSInvocation或objc_msgSend或其他什么,我可以调用var args方法,参数来自数组?
没有简单的方法可以做到这一点,因为如何传递参数进入特定系统调用ABI的丑陋细节,你必须知道例如将多少个参数放入寄存器,以及如何处理剩余的参数等.这将涉及装配,而且不能以一般方式完成.
通常,任何具有类似varargs的方法或函数的API也会
va_list参数的方法(例如-[NSString initWithFormat:]has -[NSString initWithFormat:arguments:]).如果是这种情况,那么您可以使用该技术va_list从注释中链接到的文章构建.(甚至构建va_list系统特定且不可移植.但至少它可以在Mac和iPhone上运行,并且它非常简单,并且不涉及组装.)NSArray *的元素或C阵列(例如-[NSArray initWithObjects:]具有-[NSArray initWithObjects:count:])-[UIAlertView initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:]可以通过-[UIAlertView addButtonWithTitle:]多次调用来实现).如果您的varargs API没有上述之一,那么它是一个设计糟糕的API,您应该向编写它的人抱怨.如果你真的碰到这种情况,我猜测可以使用像libffi这样的东西,它允许你动态地进行函数调用,并处理系统相关的调用机制的细节.
| 归档时间: |
|
| 查看次数: |
550 次 |
| 最近记录: |