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
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.)
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.
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 10Ich dachte, ich würde dies auch als eine alternative Option teilen, wie es für mich funktioniert.
Prost
- 1. Verschachtelung mehr (mehr als 2) unregelmäßige Listen mit LINQ
- 2. MySQL Vorkommen zählen mehr als 2
- 3. Mehr als 2 Y-Achse in Grafana
- 4. Inline bedingte zwischen mehr als 2 Werte
- 5. Effizient verbinden mehr als 2 data.tables
- 6. Laufende Selentests in Parrallel (mehr als 2)
- 7. Selen: wie mehr als 2 Ausnahme ignorieren
- 8. SEL performSelector und Argumente
- 9. Multi in Python mit mehr als 2 Ebenen
- 10. Abrufen von Daten aus mehr als 2 Tabellen mit EntityFramework
- 11. Wie man mehr als 2 DOM-Objekte mit jQuery zusammenführen?
- 12. kann mehr als 2-dimensionale Matrix mit math.net
- 13. Mehr als 2 Partitionen mit OpenEmbedded Wic Kickstart
- 14. Wie verkettet man mehr als 2 Felder mit SQL?
- 15. Wie man mehr als 2 Tabelle mit SQL-Abfrage verbinden?
- 16. MongoDB Projekt die Dokumente zählen mit mehr als 2
- 17. Multiplexing mehr als 2 Signale mit Altera LPM
- 18. dispatch_after versus performSelector afterDelay
- 19. Java äquivalent zu [self performSelector: foo afterDelay: 2]
- 20. Verwenden von zwei (oder mehr) Objekten als HashMap-Schlüssel
- 21. PerformSelector Monotouch Threading
- 22. performSelector für eine Kategorieklassenmethode
- 23. Schienen bauen Funktion mit 2 Objekten
- 24. Mit WCSession mit mehr als einem Viewcontroller
- 25. AngularJs Wie mehrere Ansichten haben (mehr als 2) und jede Ansicht mehr als einen Zustand (mit Tabs)
- 26. replaceWith Jquery funktioniert nicht, wenn mehr als 2 Bilder
- 27. Mmap kann nicht mehr als 2 GB zusammenhängende Daten zuweisen
- 28. Merge von mehr als 2 Python pandas Datenrahmen
- 29. Laravel 5.2 Validierung erforderlich_ohne Fehler bei mehr als 2 Feldern
- 30. Angular 2 Mehr als eine Komponente auf der gleichen Seite
Wenn objc_msgSend verwenden, müssen Sie zu #import Stand: http://stackoverflow.com/questions/4896510/how-to-import-nsobjcruntime-h -to-use-objc-msgsend –
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. –