¿Los selectores en Objective-C son simplemente otra forma de enviar un mensaje a un objeto? Realmente no entiendo por qué o cómo usarlos.¿Los selectores en Objective-C son simplemente otra forma de enviar un mensaje a un objeto?
Respuesta
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].
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í:
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.
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.)
--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.
- 1. Convertir/enviar un objeto stdClass a otra clase
- 2. de mensaje cerrar otra forma
- 3. ¿Puedo colocar un ObjectiveC @selector en un NSDictionary?
- 4. mejor manera de enviar un mensaje a un hilo
- 5. Enviar un mensaje a todos los clientes de un Grupo, a excepción del cliente actual
- 6. ¿Registrar un mensaje enviar a nil?
- 7. Enviar un objeto por Internet
- 8. MessagingExceptionIOException al enviar un mensaje en java?
- 9. enviar una notificación desde javascript en UIWebView a ObjectiveC
- 10. CQRS: ¿cuándo enviar un mensaje de confirmación?
- 11. Enviar un mensaje a un amigo, me pregunto Javascript API
- 12. Enviar un mensaje de texto de R
- 13. SignalR + enviar un mensaje a un concentrador a través de un método de acción
- 14. Git: Enviar a un repositorio remoto con un mensaje
- 15. Enviar mensaje en C#
- 16. enviar un mensaje de texto a través de .net
- 17. Combinar dos selectores con un objeto jQuery
- 18. IMAP: cómo mover un mensaje de una carpeta a otra
- 19. ¿Cómo enviar un mensaje de sesión a un usuario anónimo en un sitio de Django?
- 20. ¿Los selectores css de atributo de datos son más rápidos que los selectores de clase?
- 21. Enviar mensaje signalr de servidor a todos los clientes
- 22. Enviar mensaje de una aplicación de consola en ejecución a otra
- 23. ¿Cómo enviar un mensaje sin un destino específico en MPI?
- 24. ¿Hay alguna forma de controlar los cambios en un objeto?
- 25. Enviar un mensaje a través de XMPPFramework para iOS
- 26. ¿Hay un "o" en los selectores XPath?
- 27. Enviar objeto Java a un servicio web en reposo
- 28. 'Llamar a un método' O 'enviar un mensaje' en el Objetivo C
- 29. ¿Cómo enviar un mensaje a un TThread desde el hilo principal en Delphi?
- 30. ¿Es malo enviar un mensaje a self() in init?
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
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. –
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