3

我想调用具有通常 NSError** 参数的方法的选择器:

-(int) getItemsSince:(NSDate *)when dataSelector:(SEL)getDataSelector error:(NSError**)outError  {
    NSArray *data = nil;
    if([service respondsToSelector:getDataSelector]) {
        data = [service performSelector:getDataSelector withObject:when withObject:outError];
        // etc.

...编译器不喜欢的:

warning: passing argument 3 of 'performSelector:withObject:withObject:' from incompatible pointer type

有什么办法可以绕过将指针封装在一个对象中?

4

3 回答 3

14

查看NSInvocation,它可以让您以更灵活的方式“执行选择器”。

这里有一些代码可以帮助您入门:

if ([service respondsToSelector:getDataSelector]) {
    NSArray *data;
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:
        [service methodSignatureForSelector:getDataSelector]];
    [invocation setTarget:delegate];
    [invocation setSelector:getDataSelector];
    // Note: Indexes 0 and 1 correspond to the implicit arguments self and _cmd, 
    // which are set using setTarget and setSelector.
    [invocation setArgument:when atIndex:2]; 
    [invocation setArgument:outError atIndex:3];
    [invocation invoke];
    [invocation getReturnValue:&data];
}
于 2009-05-20T20:30:32.800 回答
3

NSError** 不是一个对象 (id),performSelector 对每个 withObject 参数都需要它。您可以访问 NSInvocation,但如果这只是您想要使用的一条消息,那似乎需要做很多工作。尝试定义一个中间选择器方法,该方法将您包装的 NSError** 作为 arg 在一个对象中,并让该方法对其执行 performSelector (我认为这可能是您在问题结束时的意思?)

于 2009-05-20T20:29:23.037 回答
2

我不是很肯定,但您可能想看看使用 anNSInvocation而不是-performSelector:withObject:withObject. 由于NSInvocation接受 type 的参数void*,它可以/应该让你设置任何你想要的作为参数。

与简单的调用相比,它需要多行代码performSelector:,但它可能比将指针包装在对象中更方便。

于 2009-05-20T20:22:20.787 回答