2012-05-25 10 views
8

He leído muchos artículos para entender por qué es necesario usar @selector() para referirse a un método, pero no creo que esté satisfecho. Cuando se especifica una acción para un botón, por ejemplo, tenemos que escribir:¿Para qué es la directiva @selector? ¿Por qué no simplemente usar el nombre del método?

[btn addTarget:self action:@selector(myMethod)]; 

Por qué no simplemente:

[btn addTarget:self action:myMethod]; 

favor explicar la necesidad y la razón, y lo que sucede sin él.

+0

Esto se debe a que en Objective-C tenemos el paso de mensajes no método de llamada ... –

+1

Perfectamente una pregunta válida y, hasta el momento, ninguna de las respuestas toca el motivo real (aunque todos han dado buenas razones por las cuales se utilizan selectores en primer lugar). – bbum

Respuesta

8

He leído muchos artículos para comprender la palabra clave @selector pero aún no entiendo su propósito. Solo quiero preguntar por qué tenemos @selector.

Todo tiene que ver con el análisis del lenguaje C.

Por su parte, en una expresión como [obj performSelector:someRandomSelector]' el compilador trata someRandomSelector poco como "ampliar lo someRandomSelector es - la evaluación de expresiones, que trata de #defines, se establece un símbolo para vincular más tarde, etc ... - y cualquiera que sea que los rendimientos de expansión mejor que sea un SEL.

por lo tanto, si tuviera que escribir [obj performSelector:action]' el compilador no tienen manera de saber la diferencia entre action como una variable que contiene un selector potencialmente volátil y action ser el nombre real de un método de obj.

@selector() resuelve esto creando una adición sintáctica al lenguaje que siempre se evalúa como un resultado de SEL constante.

Históricamente, Objective-C se implementó originalmente como una extensión directa al preprocesador C. Todas las diversas adiciones prefijadas de @... hicieron que la implementación fuera mucho más sencilla, ya que básicamente cualquier cosa precedida por un @ era un Objective-Cism.

0
+0

En realidad, los selectores * do * persisten durante el tiempo de ejecución en Objective-C, y un selector es internamente esencialmente una cadena C única. –

+0

Ok, eliminé mi explicación torpe, y solo me vincularé a los documentos. – woz

1

Es una cuestión de diseño del lenguaje. Necesita algo para decir 'esto es un selector' y esa es la sintaxis que usaron para separar el texto en el archivo fuente que describe el selector del que está hablando y el código que lo rodea. Esto requiere algún tipo de cita o corchete a su alrededor. @selector(...) es solo la sintaxis con la que fueron.

¿Qué sucede si tiene un selector que contiene :, por ejemplo llamado thingWithX:y:z:? No puede tener [btn addTarget:self action:thingWithX:y:z:] ya que los dos puntos confundirían al compilador. Debería tener [btn addTarget:self action:@selector(thingWithX:y:z:)] para poder separar el selector de btn action: y el selector al que hace referencia `thingWithX:y:z:.

0

Su ejemplo puede funcionar, si myMethod es una instancia de SELECTOR

[btn addTarget:self action:myMethod]; 

Para cadena que puede utilizar

[btn addTarget:self action:NSSelectorFromString(@"myMethod")]; 

explicado aquí https://developer.apple.com/library/mac/documentation/General/Conceptual/DevPedia-CocoaCore/Selector.html

Aquí se muestra un ejemplo de un actionLinker genérica función How to programmatically setup a CallBacks for a UIButton?

- (void)setRunButton:(UIButton *)objectName mySelector:(NSString *)action myControlEvent:(UIControlEvents)controlEvent { 

    [objectName addTarget:self action:NSSelectorFromString(action) forControlEvents:controlEvent]; 

} 

si desea utilizar su propio ejemplo con myMethod como una instancia de selector, siguiente código es más aplicable

- (void)setRunButton:(UIButton *)objectName mySelector:(SEL)action myControlEvent:(UIControlEvents)controlEvent { 

    [objectName addTarget:self action:action forControlEvents:controlEvent]; 

} 
Cuestiones relacionadas