Frage

Ich möchte einen Selektor einer Methode aufzurufen, die die übliche NSError hat ** Argument:

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

..., die der Compiler nicht mag:

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

Gibt es eine Möglichkeit, um diese kurz von den Zeiger in einem Objekt einkapseln?

War es hilfreich?

Lösung

Check out NSInvocation , die Sie "perform" in eine viel flexibleren Weise ermöglicht.

Hier ist ein Code für den Anfang:

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

Andere Tipps

NSError ** ist kein Objekt (id), die perform für jede der args will withobject. Sie könnten zu NSInvocation gehen, aber das scheint wie eine Menge Arbeit, wenn dies nur eine einzige Nachricht, die Sie verwenden möchten. Versuchen Sie, eine Zwischenauswahlmethode definiert, die als arg Ihre gewickelt NSError ** in einem Objekt nimmt, und lassen Sie diese Methode tun, um die perform darauf (was meiner Meinung nach war wahrscheinlich das, was Sie am Ende Ihrer Frage gemeint?)

Ich bin nicht positiv, aber Sie können einen Blick auf mit einem NSInvocation statt -performSelector:withObject:withObject. Da NSInvocation Argumente vom Typ void* nimmt, kann es / sollten wir Sie einstellen, was Sie als Argument wollen.

Es wird noch einige Zeilen Code erfordert als ein einfacher performSelector: Ruf, aber es wird wahrscheinlich bequemer sein als der Zeiger in einem Objekt gewickelt wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top