2011-04-09 21 views
74

¿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 y un selector?

+5

Relacionados: [¿Método de llamada o mensaje de envío?] (Http://stackoverflow.com/questions/2852381/calling-a-method-or-sending-a-message-in-objective-c) [Método call o performSelector] (http://stackoverflow.com/questions/2674827/using-self-method-or-selectormethod) Similar: [Diferencia entre firma y selector] (http://stackoverflow.com/questions/3095015/whats -la-diferencia-entre-el-método-firma-y-el-selector-en-objetivo) –

Respuesta

129

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 e invocarlo 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 para enviar 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 se puede recuperar internamente usando una estructura Method (recuperable desde el tiempo de ejecución).


Algunas otras cosas relacionadas que no pidió:

  • método de firma - una firma de método representa los tipos de datos devueltos por y aceptados por un método. Se pueden representar en tiempo de ejecución a través de NSMethodSignature y (en algunos casos) en bruto char*.

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

Una de las cosas divertidas que se dan cuenta es que el nombre de un método (el selector) es distinta de la aplicación del método (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 IMP del método. Esto te permite hacer cosas realmente locas y trippy. No es para los débiles de corazón. :)

7

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 tecla 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.

1

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

consulte el enlace, pero me daré un breve resumen:

Un método es esencialmente como un método de función que estás acostumbrado en tu lenguaje de programación favorito.

Un mensaje (del artículo) "Un mensaje se puede reenviar 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 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 hacer referencia 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 del tipo SEL". (desde: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocSelectors.html)

Cuestiones relacionadas