Ich weiß, wie man einen SEL
zur Kompilierungszeit mit erstellt, @selector(MyMethodName:)
aber ich möchte einen Selektor dynamisch aus einem erstellen NSString
. Ist das überhaupt möglich?
Was ich tun kann:
SEL selector = @selector(doWork:);
[myobj respondsToSelector:selector];
Was ich tun möchte: (Pseudocode, das funktioniert offensichtlich nicht)
SEL selector = selectorFromString(@"doWork");
[myobj respondsToSelector:selector];
Ich habe die Apple API-Dokumente durchsucht, aber keinen Weg gefunden, der nicht auf der @selector(myTarget:)
Syntax zur Kompilierungszeit beruht .
objective-c
cocoa
dynamic
craigb
quelle
quelle
Laut der XCode-Dokumentation macht Ihr Pseudocode es im Grunde richtig.
setWidthHeight = NSSelectorFromString(aBuffer);
Edit: Schade, zu langsam. : P.
quelle
NSStringFromSelector(@"doWork")
konvertiert es in die andere Richtung (nur zuIch muss sagen, dass es etwas komplizierter ist, als die Antworten der vorherigen Befragten vermuten lassen ... wenn Sie wirklich einen Selektor erstellen möchten ... nicht nur "einen anrufen", den Sie "herumliegen". .
Sie müssen einen Funktionszeiger erstellen, der von Ihrer "neuen" Methode aufgerufen wird. Für eine Methode wie würden
[self theMethod:(id)methodArg];
Sie also schreiben ...und dann müssen Sie den
IMP
Block dynamisch generieren , diesmal unter Übergabe von "self", theSEL
und allen Argumenten ...und fügen Sie es Ihrer Klasse hinzu, zusammen mit einer genauen Methodensignatur für den gesamten Trottel (in diesem Fall
"v@:@"
void return, Objektaufrufer, Objektargument)Sie können einige gute Beispiele für diese Art von Laufzeit-Spielereien in einem meiner Repos hier sehen.
quelle
Ich weiß, dass dies schon vor langer Zeit beantwortet wurde, aber ich möchte es trotzdem teilen. Dies kann auch mit erfolgen
sel_registerName
.Der Beispielcode in der Frage kann folgendermaßen umgeschrieben werden:
quelle
NSSelectorFromString
von @ torsten-mareksel_registerName
unter der Haube. appledev : "NSSelectorFromString übergibt eine UTF-8-codierte Zeichendarstellung von aSelectorName an sel_registerName und gibt den von dieser Funktion zurückgegebenen Wert zurück"