2009-02-12 17 views
24

soy nuevo en Cacao/Cocoa Touch, y trabajando a través de un libro de desarrollo. Me encontré con situaciones donde se usa el operador @selector(). Estoy un poco perdido sobre cómo y cuándo se debe usar el operador @selector(). ¿Puede alguien proporcionar una explicación breve y dulce y un ejemplo de por qué se usa y qué beneficio le da al desarrollador?Explicación de cacao uso @selector

Por cierto, aquí es el código de la muestra tomada del sitio de desarrollo de iPhone de Apple que utiliza @selector()

if ([elementName isEqualToString:@"entry"]) 
{ 

    parsedEarthquakesCounter++; 

    // An entry in the RSS feed represents an earthquake, so create an instance of it. 
    self.currentEarthquakeObject = [[Earthquake alloc] init]; 
    // Add the new Earthquake object to the application's array of earthquakes. 
    [(id)[[UIApplication sharedApplication] delegate] 
      performSelectorOnMainThread:@selector(addToEarthquakeList:) 
      withObject:self.currentEarthquakeObject waitUntilDone:YES]; 
    return; 
} 
+0

posible duplicado de [? Cómo hacer SEL y el trabajo en @selector SDK iPhone] (http://stackoverflow.com/questions/297680/how-do- sel-y-selector-work-in-iphone-sdk) – Monolo

Respuesta

40

El operador de selección proporciona una manera de referirse a un método proporcionado por un objeto, algo similar a un puntero de función en C. Es útil porque le permite desacoplar el proceso de invocación de métodos en un objeto. Por ejemplo, una pieza de código podría proporcionar un método, y otra pieza de código podría aplicar ese método a un determinado conjunto de objetos.

Ejemplos:

prueba para ver si un objeto implementa un cierto método:

[object respondsToSelector:@selector(methodName)] 

tienda un método a llamar más tarde en un objeto;

SEL method = @selector(methodName); 
[object performSelector:method]; 

Llamar a un método en un hilo diferente (útil para el trabajo GUI).

[object performSelectorOnMainThread:@selector(methodName)] 
+3

Gracias por la explicación - ¿puede dar un ejemplo de por qué lo utilizaría en lugar de llamar a un método en el modo convencional, suponiendo que conoce que el objeto admite que el método ? – lupefiasco

+9

@lupefiasco: [object performSelectorInBackground: @selector (methodName)] dará lugar a una llamada asincrónica al método. – codelogic

+10

Otro caso de uso es si tiene el nombre del selector como una cadena, entonces puede hacer, en tiempo de ejecución, algo así como [object performSelector: NSSelectorFromString (algo) ...] – codelogic

2

@selector() se utiliza cada vez que se necesita para pasar el nombre de un método como un argumento a otro método, una función o como un valor variable. Pasar directamente el nombre no funciona en el objetivo-C.

4

Además de lo que se ha dicho, puede también concluir la @selector en un NSInvocation para su uso posterior. Puede establecer los argumentos en NSInvocation mucho tiempo después de su creación y activarlos cuando necesite que se dispare el mensaje. Esto te da mucho poder.

Para una introducción al concepto, Scott Stevenson tiene un gran post titulado "Dynamic Objective-C with NSInvocation".

2

Un ejemplo práctico es validateMenuItem método en el que los elementos de menú se identifican con sus medidas específicas.

ejemplo simplificado:

- (BOOL)validateMenuItem:(NSMenuItem *)item { 
    if ([item action] == @selector(selectFiles:) && otherCondition) { 
     return YES; 
    } else { 
     return NO; 
    } 
} 
0

Puede utilizar un selector para invocar un método en un objeto-esto proporciona la base para la implementación del patrón de diseño de objetivos de acción en el cacao.

[myObject performSelector:@selector(runMYmethod:) withObject:parameters]; 

es equivalente a:

[myObject runMYmethod:parameters];