¿Cuál es la diferencia entre un método, un selector y un mensaje en Objective-C?
¿Cuál es la diferencia entre un método, un selector y un mensaje en Objective-C?
Respuestas:
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 obj
y key
. Los mensajes se pueden encapsular en un NSInvocation
objeto 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 Method
estructura (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 NSMethodSignature
y (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 IMP
del método. Esto te permite hacer cosas realmente locas y alucinantes. No es para los débiles de corazón. :)
if
declaración? Supongo que es porque sin los if
s 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.
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.
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 )