Je sais comment créer un SEL
au moment de la compilation en utilisant @selector(MyMethodName:)
mais ce que je veux faire est de créer un sélecteur dynamiquement à partir d'un fichier NSString
. Est-ce seulement possible?
Qu'est-ce que je peux faire:
SEL selector = @selector(doWork:);
[myobj respondsToSelector:selector];
Ce que je veux faire: (pseudo code, cela ne fonctionne évidemment pas)
SEL selector = selectorFromString(@"doWork");
[myobj respondsToSelector:selector];
J'ai cherché dans la documentation de l'API Apple, mais je n'ai pas trouvé de moyen qui ne repose pas sur la @selector(myTarget:)
syntaxe de compilation .
objective-c
cocoa
dynamic
Craigb
la source
la source
Selon la documentation XCode, votre psuedocode fait les choses correctement.
setWidthHeight = NSSelectorFromString(aBuffer);
Edit: Bummer, trop lent. : P
la source
NSStringFromSelector(@"doWork")
le convertit dans l'autre sens (juste pour info)Je dois dire que c'est un peu plus compliqué que ce que les réponses des répondants précédents pourraient suggérer ... si vous voulez vraiment créer un sélecteur ... pas seulement "appeler un" que vous "avez traîner" .. .
Vous devez créer un pointeur de fonction qui sera appelé par votre "nouvelle" méthode .. donc pour une méthode comme
[self theMethod:(id)methodArg];
, vous écririez ...et ensuite vous devez générer le
IMP
bloc dynamiquement, cette fois, en passant, "self", leSEL
, et tous les arguments ...et ajoutez-le à votre classe, avec une signature de méthode précise pour l'ensemble de la ventouse (dans ce cas
"v@:@"
, retour vide, appelant d'objet, argument d'objet)Vous pouvez voir quelques bons exemples de ce genre de manigances d'exécution , dans l'un de mes dépôts, ici.
la source
Je sais que cela a été répondu depuis longtemps, mais je veux toujours partager. Cela peut être fait en utilisant
sel_registerName
aussi.L'exemple de code dans la question peut être réécrit comme ceci:
la source
NSSelectorFromString
mentionné par @ torsten-marek utilisesel_registerName
sous le capot. appledev : "NSSelectorFromString transmet une représentation de caractère codé UTF-8 de aSelectorName à sel_registerName et renvoie la valeur renvoyée par cette fonction"