需要/想要传递NSError **作为performSelector的参数

时间:2009-05-20 20:13:55

标签: iphone objective-c selector

我想调用具有通常的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

有没有办法解决将指针封装在对象中的问题?

3 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:3)

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

答案 2 :(得分:2)

我不是肯定的,但你可能想看看使用NSInvocation代替-performSelector:withObject:withObject。由于NSInvocation接受void*类型的参数,它可能/应该让你设置你想要的任何参数。

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