Sé cómo crear un SEL
en tiempo de compilación usando, @selector(MyMethodName:)
pero lo que quiero hacer es crear un selector dinámicamente desde un archivo NSString
. ¿Es esto siquiera posible?
Que puedo hacer:
SEL selector = @selector(doWork:);
[myobj respondsToSelector:selector];
Lo que quiero hacer: (pseudocódigo, esto obviamente no funciona)
SEL selector = selectorFromString(@"doWork");
[myobj respondsToSelector:selector];
He estado buscando los documentos de la API de Apple, pero no he encontrado una forma que no dependa de la @selector(myTarget:)
sintaxis en tiempo de compilación .
objective-c
cocoa
dynamic
craigb
fuente
fuente
De acuerdo con la documentación de XCode, su psuedocode básicamente lo hace bien.
setWidthHeight = NSSelectorFromString(aBuffer);
Editar: Lástima, demasiado lento. :PAGS
fuente
NSStringFromSelector(@"doWork")
lo convierte al revés (solo para su información)Debo decir que es un poco más complicado de lo que podrían sugerir las respuestas de los encuestados anteriores ... si realmente desea crear un selector ... no solo "llamar a uno" que "tienes por ahí" ... .
Necesita crear un puntero de función que será llamado por su método "nuevo" ... así que para un método como
[self theMethod:(id)methodArg];
, escribiría ...y luego necesitas generar el
IMP
bloque dinámicamente, esta vez, pasando, "self", elSEL
, y cualquier argumento ...y agréguelo a su clase, junto con una firma de método precisa para todo el lechón (en este caso
"v@:@"
, retorno vacío, llamador de objeto, argumento de objeto)Puedes ver algunos buenos ejemplos de este tipo de travesuras en tiempo de ejecución , en uno de mis repositorios, aquí.
fuente
Sé que esto ha sido respondido hace mucho tiempo, pero aún quiero compartirlo. Esto también se puede hacer usando
sel_registerName
.El código de ejemplo en la pregunta se puede reescribir así:
fuente
NSSelectorFromString
mencionado por @ torsten-marek usasel_registerName
bajo el capó. appledev : "NSSelectorFromString pasa una representación de caracteres codificados en UTF-8 de aSelectorName a sel_registerName y devuelve el valor devuelto por esa función"