2009-05-20 99 views
3

我想要调用具有通常NSError的方法的选择**论点:需要/想传递一个NSError **作为参数传递给performSelector

-(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. 

...,编译器没有按” t like:

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

有没有什么办法可以封装指针的对象?

回答

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]; 
} 
+0

只是为了正确性 - [自methodSignatureForSelector:getDataSelector]在第三行上面应该是[服务methodSignatureForSelector:getDataSelector] – edoloughlin 2009-05-21 11:22:08

2

我并不积极,但你可能想看看使用NSInvocation而不是-performSelector:withObject:withObject。由于NSInvocation需要void*类型的参数,它可能/应该让你设置任何你想要的参数。

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

3

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