¿Cuál es la diferencia entre un método y un selector?

¿Cuál es la diferencia entre un método, un selector y un mensaje en Objective-C?

Esta es una gran pregunta.

  • Selector : un Selector es el nombre de un método. Está muy familiarizado con estos selectores: alloc , init , release , dictionaryWithObjectsAndKeys: setObject:forKey: etc. Tenga en cuenta que los dos puntos son parte del selector; es cómo identificamos que este método requiere parámetros. Además (aunque es extremadamente raro), puede tener selectores como este: doFoo::: . Este es un método que toma tres parámetros, y lo invocaría como [someObject doFoo:arg1 :arg2 :arg3] . No es necesario que haya letras antes de cada parte de los componentes del selector. Como dije, esto es extremadamente raro, y no lo encontrará utilizado en los marcos de Cocoa. Puede trabajar con selectores directamente en Cocoa. Tienen el tipo SEL : SEL aSelector = @selector(doSomething:) o SEL aSelector = NSSelectorFromString(@"doSomething:");

  • Mensaje : un mensaje es un selector y los argumentos que está enviando con él. Si digo [dictionary setObject:obj forKey:key] , entonces el “mensaje” es el selector setObject:forKey: más los argumentos obj y key . Los mensajes se pueden encapsular en un objeto NSInvocation para una invocación posterior. Los mensajes se envían a un receptor . (es decir, el objeto que “recibe” el mensaje).

  • Método : un método es una combinación de un selector y una implementación (y los metadatos que lo acompañan). La “implementación” es el bloque real de código; es un puntero a la función (un IMP ). Un método real puede recuperarse internamente utilizando una estructura de Method (recuperable desde el tiempo de ejecución).


Algunas otras cosas relacionadas que no solicitó:

  • Firma del método : una firma de método representa los tipos de datos devueltos y aceptados por un método. Pueden representarse en tiempo de ejecución a través de un NSMethodSignature y (en algunos casos) un char* procesar.

  • Implementación : el código ejecutable real de un método. Su tipo en tiempo de ejecución es un IMP , y en realidad es solo un puntero de función. iOS 4.3 incluye una nueva capacidad para convertir un bloque en un IMP . Esto es realmente genial .

Una de las cosas divertidas para darse cuenta es que el nombre de un método (el selector) es distinto de la implementación del método (el IMP). Esto significa que puedes intercambiarlos, si te sientes audaz. También puede agregar y eliminar métodos en tiempo de ejecución, ya que todo lo que hace es editar una entrada en una tabla hash: la clave es el selector y el valor es el IMP del método. Esto te permite hacer cosas realmente locas y trippy. No es para los débiles de corazón. 🙂

Un método es la implementación que se ejecuta cuando se le pide a un objeto o clase que realice alguna acción. Está en el ámbito de su clase contenedora y, por lo tanto, es diferente cuando se hace referencia a ella a través de otra clase. Un selector es un identificador que representa el nombre de un método. No está relacionado con ninguna clase o método específico, y se puede utilizar para describir un método de cualquier clase, ya sea una clase o método de instancia.

Simplemente, un selector es como una llave en un diccionario. Puede decirle de qué método está hablando alguien, pero solo si también tiene el diccionario en sí (la clase o el objeto). El método es lo que obtienes cuando solicitas el valor del diccionario usando el selector como clave.

Este sitio tiene una buena visión general de toda la terminología en cuestión: http://www.otierney.net/objective-c.html

Mira el enlace, pero te daré un resumen rápido:

Un método es esencialmente como un método de función al que está acostumbrado en su lenguaje de progtwigción favorito.

Un mensaje (del artículo) “Un mensaje puede enviarse dinámicamente a otro objeto. Llamar a un mensaje sobre un objeto en Objective-C no significa que el objeto implemente ese mensaje, solo que sepa cómo responder de alguna manera a través de él. implementarlo directamente o reenviar el mensaje a un objeto que sí sabe cómo hacerlo “.

Los selectores pueden significar dos cosas. Puede hacer referencia al nombre de un método, o “se refiere al identificador único que reemplaza el nombre cuando se comstack el código fuente. Los selectores comstackdos son del tipo SEL”. (de: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocSelectors.html )