En Objective C tienes el concepto de enviar mensajes a otros objetos, y, bueno, esto es muy similar a llamar a métodos en lenguajes como C # y Java.
Pero, ¿cuáles son exactamente las diferencias sutiles? ¿Cómo debo pensar en los mensajes cuando pienso en mi código?
Nota: Solo un poco de experiencia aquí, soy un desarrollador de C # / Java que intenta entender algunos conceptos sobre Objective C.
Respuestas:
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 un fragmento de código en una clase identificada por un selector.
En otras palabras,
[foo bar: baz]
dice "envíe el mensaje llamado@selector(bar:)
con el parámetrobaz
al objetofoo
. Puede enviar ese mensaje a muchos objetos diferentes.Por el contrario, el método
bar:
para unFoo
podría verse asípero por un momento
FooTwo
podría parecer(Espero tener la sintaxis correcta; ha pasado un tiempo desde la última vez que toqué Objective-C).
Cuando envía el mensaje, el núcleo Objective-C envía el mensaje al
foo
que decide si comprende 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 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 que coincida con ese mensaje , y el proxy reenvía el mensaje a su objeto envuelto.
fuente
Desde un punto de vista puramente teórico, no hay ninguna diferencia entre los dos: ha habido una serie de pruebas formales que muestran que los dos son completamente equivalentes, y que ambos pueden implementarse completamente en términos del otro.
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 está asignada estáticamente y el contenido de cada tabla se fija en tiempo de compilación. La búsqueda de mensajes, por el contrario, generalmente 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 principalmente teórico. Primero, básicamente se trata de código auto modificable, que la mayoría de la gente decidió que fue una muy mala idea durante mucho tiempohace tiempo. En segundo lugar, para que sea muy significativo, necesita poder compilar un nuevo código en la clase existente para responder al nuevo mensaje que admite. Sin eso, todo lo que gana es la capacidad de agregar dinámicamente un nuevo nombre para un método existente.
Como implica 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) diferentes formas de soportar la unión tardía. 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.
fuente
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 dinámica que declara que un objeto también está vinculado tarde.
fuente
Por lo general, las llamadas a métodos se resuelven en tiempo de compilación (a menos que use la reflexión en Java), mientras que los mensajes en el Objetivo C se envían en tiempo de ejecución.
fuente
struct
como primer parámetro. La unión tardía es una parte esencial del polimorfismo y, por lo tanto, de la POO.Los mensajes son manejados por el núcleo o por el propio lenguaje (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 llamadas / funciones del sistema: puede encontrarlos si busca la programación del sistema Unix.
La diferencia principal entre una llamada al método y un mensaje es esta:
una llamada al método solo ocurre en su código: en ASM se traduce mediante un PUSH de los argumentos pasados.
un mensaje de kernel es principalmente algo enviado al kernel que se rastrea y devuelve a ciertos procesos. Puedo confundirlos con tuberías, pero lo que sea: sepa 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.
fuente