¿Diferencias entre mensajes y métodos?

13

En Objective C tienes el concepto de enviar mensajes a otros objetos y, bueno, esto es muy similar al método de llamada en lenguajes como C # y Java.

¿Pero qué exactamente son las diferencias sutiles? ¿Cómo debo pensar en los mensajes cuando pienso en mi código?

Nota: solo un poco de antecedentes, soy un desarrollador de C # / Java que trata de entender algunos conceptos sobre el Objetivo C.

    
pregunta Vidar 11.02.2011 - 12:26

5 respuestas

10

Un mensaje es el nombre de un selector y los parámetros para ese selector.

Un selector es un símbolo.

Un método es una pieza de código en una clase identificada por un selector.

En otras palabras, [foo bar: baz] dice "envía el mensaje llamado @selector(bar:) con el parámetro baz al objeto foo . Puedes enviar ese mensaje a muchos objetos diferentes.

Por el contrario, el método bar: para un Foo podría verse como

-(int)bar:(int)n {
  return n + 1;
}

pero para FooTwo podría verse como

-(int)bar:(int)n {
  return n + 2;
}

(Espero tener la sintaxis correcta; ha pasado un tiempo desde que toqué Objective-C por última vez)

Cuando envía el mensaje, el kernel de Objective-C envía el mensaje a foo , que decide si entiende el mensaje. Decide esto en función de si puede encontrar un método identificado por ese selector.

Dos métodos con el mismo nombre y un mensaje.

También es posible que un objeto simplemente reenvíe un mensaje particular (o un conjunto de mensajes) a otro objeto para su procesamiento. En este caso, envía un mensaje a este objeto proxy, que no tiene métodos para coincidir con ese mensaje , y el proxy reenvía el mensaje a su objeto envuelto.

    
respondido por el Frank Shearar 11.02.2011 - 14:00
3

Desde un punto de vista puramente teórico, no hay diferencia entre los dos en absoluto: ha habido varias pruebas formales que muestran que las dos son completamente equivalentes, y cualquiera de ellas puede implementarse completamente en términos de la otra.

Desde un punto de vista un poco menos teórico, hay una posible diferencia: en una implementación típica, la tabla de funciones virtuales se asigna estáticamente y el contenido de cada vtable se fija en el momento de la compilación. La búsqueda de mensajes, por el contrario, normalmente se realiza con algún tipo de objeto similar a un mapa, que suele ser dinámico, lo que significa que puede modificarlo en tiempo de ejecución. Esto hace que sea relativamente fácil agregar una nueva respuesta a un mensaje en una clase existente. Desafortunadamente, en la mayoría de los casos esto sigue siendo en su mayoría teórico. En primer lugar, básicamente estás tratando con un código de auto-modificación, que la mayoría de la gente decidió que era una idea bastante mala hace mucho tiempo. En segundo lugar, para que sea muy significativo, debe poder compilar un nuevo código en la clase existente para responder al nuevo mensaje que admite. Sin eso, casi todo lo que gana es la capacidad de agregar dinámicamente un nuevo nombre para un método existente.

Como lo indica el final del párrafo anterior, desde un punto de vista verdaderamente práctico, hay muy poca diferencia entre los dos. Son simplemente dos (muy ligeramente) formas diferentes de soportar el enlace tardío. Aunque la búsqueda basada en mensajes generalmente es un poco más lenta, sería bastante inusual que la diferencia sea realmente significativa. Para la mayoría de los propósitos prácticos, son solo dos formas diferentes de lograr lo mismo.

    
respondido por el Jerry Coffin 11.02.2011 - 18:10
1

En Objective-C, los mensajes están enlazados tarde. Es decir, se resuelven en tiempo de ejecución. C # admite una construcción similar a través de la palabra clave Dynamic, que declara que un objeto también está vinculado en el tiempo.

    
respondido por el Michael Brown 11.02.2011 - 13:59
0

Por lo general, las llamadas a métodos se resuelven en tiempo de compilación (a menos que se use la reflexión en Java), mientras que los mensajes en el Objetivo C se envían en tiempo de ejecución.

    
respondido por el Heiko Rupp 11.02.2011 - 12:30
-1

Los mensajes son manejados por el núcleo o por el propio idioma (para ObjC, por ejemplo, hay un código de ensamblaje muy pequeño que lo hace).

En el kernel de Linux, por ejemplo, los mensajes se realizan con las llamadas al sistema / función: puede encontrar información sobre ellos si busca información sobre la programación del sistema Unix.

La diferencia principal entre una llamada de método y un mensaje es la siguiente:

  • una llamada a un método solo ocurre en su código: en ASM se traduce mediante un PUSH de los argumentos pasados.

  • un mensaje del kernel es principalmente algo que se envía al kernel que se rastrea y se envía a un proceso determinado. Puedo confundirlos con tuberías, pero lo que sea: saber que ya existe un mecanismo que le permite ejecutar varios programas al mismo tiempo y dejar que se comuniquen al mismo tiempo. Por supuesto, no espere que esto funcione de la misma manera en Windows u otro sistema operativo.

respondido por el jokoon 11.02.2011 - 13:48

Lea otras preguntas en las etiquetas