代码之家  ›  专栏  ›  技术社区  ›  edoloughlin

需要/希望将nserrror**作为参数传递给performselector

  •  3
  • edoloughlin  · 技术社区  · 15 年前

    我想调用一个方法的选择器,该方法具有通常的nserrror**参数:

    -(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 回复  |  直到 10 年前
        1
  •  14
  •   Martin Gordon    15 年前

    退房 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];
    }
    
        2
  •  3
  •   jbm    15 年前

    nserrror**不是一个对象(id),PerformSelector希望为每个withObject参数使用它。您可以转到nsinvocation,但如果这只是您想要使用的一条消息,那么这似乎是一项很大的工作。尝试定义一个中间选择器方法,该方法将对象中包装好的nserrror**作为参数,并让该方法对其执行performselector(我认为这可能是您在问题结束时的意思?)

        3
  •  2
  •   Matt Ball    15 年前

    我不是很肯定,但你可能想看看使用 NSInvocation 而不是 -performSelector:withObject:withObject . 自从 NS调用 接受类型为的参数 void* ,它可以/应该让您设置任何您想要的参数。

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