Ziel C-Aufrufmethode dynamisch mit einer Zeichenfolge


74

Ich frage mich nur, ob es eine Möglichkeit gibt, eine Methode aufzurufen, bei der ich den Namen der Methode im laufenden Betrieb mit einer Zeichenfolge erstelle.

zB habe ich eine Methode namens loaddata

-(void)loadData;

Um dies zu nennen, würde ich es normalerweise so nennen

[self loadData];

Aber ich möchte es dynamisch mit einem String aufrufen können, z

NSString *methodName = [[NSString alloc] initWithString:@"loadData"];
[self methodName];

Dies ist ein dummes Beispiel, aber ich hoffe, Sie verstehen meinen Standpunkt. Ich verwende es für Datenbindungsklassen, die ich für meine IPad-Anwendung einrichte. Schwer zu erklären, aber um es zum Feuern zu bringen, muss ich herausfinden, wie man eine Methode mit einem String aufruft.

Irgendwelche Ideen?

Vielen Dank


1
+1 für klare, einfache Frage!
Linuxmint

Die Methode, die ich aufrufen möchte, ist eine Funktion, die einen NSString zurückgibt.
IPadHackAndSlash

Antworten:


108

Sie können so etwas versuchen

SEL s = NSSelectorFromString(selectorName);
[anObject performSelector:s];

In dieser Situation gibt die Methode einen Wert zurück, der in einem Fall ein NSString ist. Ich erhalte die Fehlermeldung, dass Lvalue als linker Zuweisungsoperand erforderlich ist. Dies ist mein Code: SEL s = NSSelectorFromString (@ "getIDString"); [self text] = [boundEntity performSelector: s];
IPadHackAndSlash

Was ist [Selbsttext], wo Sie den Wert return getIDString zuweisen.
Ishu

[boundEntity performSelector:s]Gibt einen Wert vom Typ zurück, der nicht mit dem Typ von übereinstimmt [self text]. Ich denke, Sie müssen @property für Text und Anruf festlegen [self setText:[[boundEntity performSelector:s]]].
Shreyasva

9
performSelector kann ein Leck verursachen, da der Selektor unbekannt ist!
Malhal


12

Sie können die Funktion objc_msgSend verwenden. Es sind zwei Parameter erforderlich, der Empfänger und der Selektor, um an ihn zu senden:

objc_msgSend(self, someSelector);

Sie müssen Ihre Zeichenfolge in den entsprechenden Selektor verwandeln, indem Sie NSSelectorFromString:

NSString *message = [self getSomeSelectorName];
objc_msgSend(self, message);

Die Methode akzeptiert auch eine variable Anzahl von Argumenten, sodass Sie Nachrichten mit einer beliebigen Anzahl von Argumenten senden können.

NSString *message = [self getSomeSelectorNameWithManyArguments];
objc_msgSend(self, message, arg1, arg2, arg3, arg4);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.