繁体   English   中英

Objective-C va_list和选择器

[英]Objective-C va_list and selectors

是否可以使用@selectorperformSelector:或类似)与使用变量参数列表的方法?

我正在编写一个可以分配委托的类来覆盖默认行为。 在存在委托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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM