Frage

Ich weiß, wie eine SEL bei der Kompilierung mit @selector(MyMethodName:) zu schaffen, aber was ich tun möchte, ist ein Selektor dynamisch aus einem NSString zu erstellen. Ist das überhaupt möglich?

Was kann ich tun:

SEL selector = @selector(doWork:);
[myobj respondsToSelector:selector];

Was ich tun möchte: (Pseudo-Code, dies offensichtlich nicht funktioniert)

SEL selector = selectorFromString(@"doWork");
[myobj respondsToSelector:selector];

Ich habe die Apple-API-Dokumentation gesucht, aber noch nicht einen Weg gefunden, die nicht auf der Kompilierung-@selector(myTarget:) Syntax angewiesen ist.

War es hilfreich?

Lösung

Ich bin kein Objective-C-Programmierer, nur ein Sympathisant, aber vielleicht Runtime Reference , die Sie verwenden können, es einen String in einen Selektor zu konvertieren.

Andere Tipps

Nach der XCode Dokumentation, Ihre psuedocode im Grunde macht es richtig.

  

Es ist die effizienteste Wert zuweisen Variablen bei der Kompilierung mit der @selector () Richtlinie SEL. Doch in einigen Fällen muß ein Programm kann eine Zeichenfolge an einen Selektor zur Laufzeit konvertieren. Dies kann mit der NSSelectorFromString Funktion erfolgen:

setWidthHeight = NSSelectorFromString(aBuffer);

Edit: Bummer, zu langsam. : P

Ich muss sagen, dass würde es ist ein wenig komplizierter als die vorherigen Antworten der Befragten könnte darauf hindeuten, ... wenn man in der Tat wirklich wollen erstellen Selektor . .. nicht nur „nennen ein“, dass man „herumliegen“ ...

Sie benötigen einen Funktionszeiger zu schaffen, die .. von Ihrer „neuen“ Methode aufgerufen wird, so für ein Verfahren wie [self theMethod:(id)methodArg];, würden Sie schreiben ...

void (^impBlock)(id,id) = ^(id _self, id methodArg) { 
     [_self doSomethingWith:methodArg]; 
};

und dann müssen Sie den IMP Block dynamisch, diesmal zu erzeugen, vorbei, „Selbst“, das SEL, und alle Argumente ...

void(*impFunct)(id, SEL, id) = (void*) imp_implementationWithBlock(impBlock);

und fügen Sie es Ihre Klasse, zusammen mit einer genauen Methodensignatur für den gesamten Sauger (in diesem Fall "v@:@", nichtig Rückkehr, Objekt Anrufer, Objekt Argument)

 class_addMethod(self.class, @selector(theMethod:), (IMP)impFunct, "v@:@");

Sie können einige gute Beispiele für diese Art von Laufzeit Spielereien , in einer meiner repos sehen, hier.

Ich weiß, das vor lange beantwortet wurde, aber immer noch will ich teilen. Dies kann auch mit sel_registerName erfolgen.

Das Codebeispiel in der Frage kann wie folgt neu geschrieben werden:

SEL selector = sel_registerName("doWork:");
[myobj respondsToSelector:selector];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top