![](/img/trans.png)
[英]how to transfer objective-c language (`va_list`,`va_start `,`va_end ` ) to swift language?
[英]Objective-C va_list and selectors
是否可以使用@selector
和performSelector:
或类似)与使用变量参数列表的方法?
我正在编写一个可以分配委托的类来覆盖默认行为。 在存在委托select方法的情况下,对该类的实例进行的调用将转发到相同的相应委托方法,其中一些方法使用变量参数列表。
因此,例如,我需要能够创建检索SEL
引用并使用如下方法向委托对象发送消息:
- (void)logEventWithFormat:(NSString *)format, ... {
va_list argList;
id del = self.delegate;
if (del != nil &&
[del conformsToProtocol:@protocol(AProtocolWithOptionalMethods)] &&
[del respondsToSelector:@selector(logEventWithFormat:)])
{
// Perform selector on object 'del' with 'argList'
}
}
我假设这是不可能的,因此在Foundation框架中类似的方法声明 - 在NSString
:
- (id)initWithFormat:(NSString*)format, ...;
和
- (id)initWithFormat:(NSString *)format arguments:(va_list)argList;
我假设我希望委托的协议应该建议实施:
- (void)logEventWithFormat:(NSString *)format arguments:(va_list)argList;
所以我的选择器@selector(logEventWithFormat:arguments:)
可以用来调用:
[del performSelector:@selector(logEventWithFormat:arguments:)
withObject:format
withObject:argList];
我只是想知道我是否遗漏了一些东西,或者想要实现我想要的目标?
您可以将任何想要的内容传递给运行时函数objc_msgSend
。
objc_msgSend(del, @selector(logEventWithFormat:arguments:), format, argList);
这是发送手动构造的消息的最有效方式。
但是,您不清楚是否需要以这种方式执行调用。 正如KennyTM指出的那样,在您拥有的代码中,您可以直接调用该方法。
您不能使用-performSelector:withObject:withObject:
因为va_list
根本不是“对象”。 您需要使用NSInvocation
。
或者直接打电话
[del logEventWithFormat:format arguments:argList];
据我所知,它无法完成。 你不能使用-performSelector:withObject:withObject:
因为@KennyTM指出, va_list
不是一个对象。
但是,您也无法使用NSInvocation
。 直截了当的文件说:
NSInvocation不支持使用可变数量的参数或联合参数调用方法。
由于这两种方式是通过选择器调用方法,并且似乎都不起作用,我将继续使用“无法完成”的答案,除非您直接调用该方法并将va_list
作为参数传递。
也许@bbum会出现并进一步启发我们。 =)
我之前没有这样做,但我经常使用的简单解决方案是为withObject参数打包/取消装入NSMutableArray或NSMutableDictionary。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.