2010-02-27 9 views
16

Gibt es eine Möglichkeit, [anObject performSelector] aufzurufen; mit mehr als 2 Objekten? Ich weiß, dass Sie ein Array verwenden können, um mehrere Argumente zu übergeben, aber ich frage mich, ob es eine niedrigere Ebene Weg zum Aufrufen einer Funktion gab, die ich mit mehr als 2 Argumente ohne eine Hilfsfunktion mit einem Nsarray von Argumenten definiert haben.performSelector mit mehr als 2 Objekten

Antwort

48

Entweder (1) Verwenden Sie eine NSInvocation oder (2) verwenden Sie direkt objc_msgSend.

objc_msgSend(target, @selector(action:::), arg1, arg2, arg3); 

(Hinweis: Stellen Sie sicher, dass alle Argumente id ‚s, sonst könnten die Argumente nicht richtig gesendet werden.)

+12

Wenn objc_msgSend verwenden, müssen Sie zu #import Stand: http://stackoverflow.com/questions/4896510/how-to-import-nsobjcruntime-h -to-use-objc-msgsend –

+1

Die letzte Notiz, die Sie gemacht haben, um sicherzustellen, dass alle Argumente vom Typ id sind .. Können Sie das weiter erklären? oder stellen Sie bitte eine Ressource zur Verfügung? Ich kann keine finden. –

14

Sie können die NSObject Klasse wie folgt erweitern:

- (id) performSelector: (SEL) selector withObject: (id) p1 
     withObject: (id) p2 withObject: (id) p3 
{ 
    NSMethodSignature *sig = [self methodSignatureForSelector:selector]; 
    if (!sig) 
     return nil; 

    NSInvocation* invo = [NSInvocation invocationWithMethodSignature:sig]; 
    [invo setTarget:self]; 
    [invo setSelector:selector]; 
    [invo setArgument:&p1 atIndex:2]; 
    [invo setArgument:&p2 atIndex:3]; 
    [invo setArgument:&p3 atIndex:4]; 
    [invo invoke]; 
    if (sig.methodReturnLength) { 
     id anObject; 
     [invo getReturnValue:&anObject]; 
     return anObject; 
    } 
    return nil; 
} 

(Siehe NSObjectAdditions aus dem Three20-Projekt.) Dann könnten Sie sogar die obige Methode erweitern, um varargs und ein Array von Argumenten ohne Nullen zu verwenden, aber das ist übertrieben.

0

Eine weitere Option, wenn Sie mehrere Objekte mit performSelector senden müssen, ist (wenn es einfach genug ist), um die Methode, die Sie aufrufen möchten, ein NSDictionary Objekt anstelle von mehreren Parametern zu nehmen, wie Sie können um so viele wie Sie möchten im Wörterbuch zu senden.

Zum Beispiel

hatte ich ein ähnliches Verfahren wie das, das 3 Argument hatte und ich brauchte es von perform zu nennen -

-(void)getAllDetailsForObjectId:(NSString*)objId segment:(Segment*)segment inContext:(NSManagedObjectContext*)context{ 

mir diese Methode geändert Verwendung eines Wörterbuchs machen das zum Speichern Argumente

-(void)getAllDetailsForObject:(NSDictionary*)details{ 

daher die Methode aufzurufen leicht

konnte ich 10

Ich dachte, ich würde dies auch als eine alternative Option teilen, wie es für mich funktioniert.

Prost

Verwandte Themen