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

Respuestas:

142

Esta es una gran pregunta.

  • Selector : un selector es el nombre de un método. Usted es muy familiarizado con estos selectores: alloc, init, release, dictionaryWithObjectsAndKeys:, setObject:forKey:, etc Tenga en cuenta que el colon es parte del selector; así es como identificamos que este método requiere parámetros. También (aunque es extremadamente raro), puede tener selectores como este: doFoo:::. Este es un método que toma tres parámetros y lo invocarías 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:)oSEL aSelector = NSSelectorFromString(@"doSomething:");

  • Mensaje : un mensaje es un selector y los argumentos que envía con él. Si digo [dictionary setObject:obj forKey:key], entonces el "mensaje" es el selector setObject:forKey:más los argumentos objy key. Los mensajes se pueden encapsular en un NSInvocationobjeto para su posterior invocación. 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 de código real; es un puntero de función (an IMP). Un método real se puede recuperar internamente mediante una Methodestructura (recuperable del tiempo de ejecución).


Algunas otras cosas relacionadas que no solicitó:

  • Firma de método : una firma de método representa los tipos de datos devueltos y aceptados por un método. Se pueden representar en tiempo de ejecución mediante un NSMethodSignaturey (en algunos casos) un raw char*.

  • Implementación : el código ejecutable real de un método. Su tipo en tiempo de ejecución es an 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 a tener en 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 puede intercambiarlos, si se siente atrevido. También puede agregar y eliminar métodos en tiempo de ejecución, porque todo lo que está haciendo es editar una entrada en una tabla hash: la clave es el selector y el valor es el IMPdel método. Esto te permite hacer cosas realmente locas y alucinantes. No es para los débiles de corazón. :)

Dave DeLong
fuente
Esta es una gran respuesta: D 1. ¿Entonces el selector es más como la firma / ruta al método en sí? Haciéndole saber al compilador, ¿así es como lo encuentra? 2. Supongo que esto es más eficaz que pasar el método en sí. ¿Correcto? 3. Porque cada selector y método tiene una relación de 1: 1 y debido a esta eficiencia es por eso que no aprueba el método. 4. También puede dar un ejemplo tonto de También puede agregar y eliminar métodos en tiempo de ejecución. Siempre he oído hablar de él, pero nunca he necesitado hacerlo, ni lo he visto, creo .
Honey
5a. ¿Es que puedo pasar un parámetro condicional que cambia entre selectores? 5b. en lugar de pasar un parámetro condicional al selector ... ¿por qué no crear un método con una ifdeclaración? Supongo que es porque sin los ifs nuestros métodos se vuelven métodos más puros que hacen lo que les dicen. Concluyendo que el 'manejo del estado' y la 'acción' que gira en torno a él no deberían estar en el mismo método.
Honey
9

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 alcance de su clase contenedora y, por lo tanto, es diferente cuando se hace referencia a través de alguna 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 usar para describir un método de cualquier clase, ya sea una clase o un método de instancia.

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

ughoavgfhw
fuente
1

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

Consulte el enlace, pero le daré un resumen rápido:

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

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

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

nstehr
fuente