2010-08-22 12 views

Respuesta

16

No son otra manera de enviar un mensaje a un objeto, que son la única manera. Por ejemplo, en [myView setValue:@"foo"], setValue: es un selector. (Otra forma menos conveniente de escribir lo mismo es objc_msgSend(myView, @selector(setValue:), @"foo").)

Como dice Ian Henry, puede usar los valores SEL para elegir un selector en tiempo de ejecución en lugar de compilar. Esta es una técnica fundamental en Cocoa; las interfaces de usuario generalmente están conectadas a controladores que usan enlaces de destino/acción, donde el objetivo es un objeto y la acción es un selector. Normalmente se establece esta en una punta, pero también puede hacerlo en código:

[myButton setTarget:myController]; 
[myButton setAction:@selector(buttonClicked:)]; // Clicking the button will now call [myController buttonClick:myButton]. 
+1

Gran respuesta, pero ¿cuál es la ventaja de hacer: [myButton setAction: @selector (buttonClicked)] ¿En lugar de enviar el mensaje directamente a myController con un mensaje "normal"? – lampShade

+3

Al configurar la acción, el mensaje se envía cuando se hace clic en el botón. Si envía el mensaje directamente, sucede "ahora" (es decir, cuando la interfaz de usuario está configurada). Tener todos los botones presionados inmediatamente cuando carga una ventana generalmente no es útil. –

+1

Déjame asegurarme de que entiendo lo que estás diciendo. digamos que tengo un botón, myButton que está en la interfaz de usuario. Si configuro una acción objetivo "normal" en el constructor de interfaz. Digamos que tengo un método llamado addItem. Cuando se carga la IU, se llama automáticamente al método addItem, incluso si el usuario no ha pulsado el botón? – lampShade

3

En lo más básico, sí, pero puede cambiar el mensaje en tiempo de ejecución. Por ejemplo:

SEL a = [selectorFactory getSelector]; 
[someOtherObject performSelector:a]; 

Y luego, en selectorFactory.getSelector:

if(foo == 1) 
    return @selector(thisSelector); 
else 
    return @selector(thatSelector); 

Viniendo de C# u otro lenguaje similar, se puede usar esto para (sin apretar) simular eventos mucho más fácilmente que el uso de NSNotification s. Por ejemplo, puede crear una clase de botón con dos ivars, target y selector, y hacer que el botón ejecute el selector en el destino cuando se hace clic (por ejemplo).

Sin embargo, hay muchos más selectores que eso. Leer más acerca de ellos aquí:

http://developer.apple.com/mac/library/documentation/cocoa/conceptual/objectivec/articles/ocSelectors.html

4

Puede almacenar selectores como variables, e invocar a ellos más tarde o en un contexto diferente. Por ejemplo, puede decirle a un objeto que realice un selector en un momento determinado o en un hilo diferente. También puede elegir qué selector realizar en función de los datos, que es cómo el constructor de interfaz y los datos centrales hacen su trabajo.

21

Los selectores se usan generalmente cuando quiere definir un mecanismo de devolución de llamada. El caso de uso más común para los selectores en Cocoa es con controles, como botones. Un UIButton es muy genérico, y como tal no tiene idea de lo que debería suceder cuando se presiona el botón. Antes de poder usar uno, debe indicarle qué método se debe ejecutar cuando se presiona el botón. Esto se hace de la siguiente manera:

[myButton addTarget:self 
      action:@selector(myButtonWasPressed) 
    forControlEvents:UIControlEventTouchUpInside]; 

- (void)myButtonWasPressed { 
    // Do something about it 
} 

Entonces, cuando se pulsa el botón, el botón se llame el selector en el objetivo lo pasamos. Con este mecanismo, no es necesario crear una subclase de un botón cada vez que desee llamar a parte de su propio código. En cambio, UIButton tiene un mecanismo genérico para enviar a cualquier código que elija. (Bueno, técnicamente, es la superclase UIControl que está proporcionando el mecanismo de despacho.)

0

--De Apple Developer Library -

Un selector es el nombre que se utiliza para seleccionar un método de ejecutar para un objeto, o la identificador único que reemplaza el nombre cuando se compila el código fuente. Un selector por sí mismo no hace nada. Simplemente identifica un método. Lo único que hace que el nombre del método selector sea diferente de una cadena simple es que el compilador se asegura de que los selectores sean únicos.Lo que hace que un selector sea útil es que (junto con el tiempo de ejecución) actúa como un puntero de función dinámica que, para un nombre de pila, apunta automáticamente a la implementación de un método apropiado para cualquier clase con la que se use. Supongamos que tiene un selector para ejecutar el método y las clases Dog, Athlete y ComputerSimulation (cada una de las cuales implementó un método). El selector podría usarse con una instancia de cada una de las clases para invocar su método de ejecución, aunque la implementación podría ser diferente para cada una.

Cuestiones relacionadas