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

edo*_*lin 3 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.
Run Code Online (Sandbox Code Playgroud)

...编译器不喜欢的:

warning: passing argument 3 of 'performSelector:withObject:withObject:' from incompatible pointer type
Run Code Online (Sandbox Code Playgroud)

有没有什么方法可以将指针封装在一个对象中呢?

Mar*_*don 14

查看NSInvocation,它允许您以更灵活的方式"performSelector".

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

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];
}
Run Code Online (Sandbox Code Playgroud)