Pregunta

Sé que Objective-C utiliza dinámica vinculante para todas las llamadas a métodos. ¿Cómo se implementa esto? No Objective-C "se convierten en código C" antes de la compilación y el uso justo (void *) punteros para todo?

¿Fue útil?

Solución

Conceptualmente, lo que está pasando es que hay una biblioteca despachador (comúnmente referido como el tiempo de ejecución de Objective C), y el compilador convierte algo como esto:

[myObject myMethodWithArg:a andArg:b ];

en

//Not exactly correct, but close enough for this
objc_msgSend(myObject, "myMethodWithArg:andArg:", a, b);

Y a continuación, las ofertas de tiempo de ejecución con toda la unión y despacho, encuentra una función apropiada, y lo llama con esos argumentos. Simplista, se puede pensar que es algo así como una búsqueda de hash; por supuesto, es mucho más complicado que luego en la realidad.

Hay muchos más temas relacionados con cosas como firmas de método (C no codifica tipos por lo que el tiempo de ejecución tiene que tratar con él).

Otros consejos

se implementa Cada método C Objetivo "bajo el capó", como (en efecto) una función C. El método tiene un mensaje (cadena de texto) asociado a él, y la clase tiene una tabla de búsqueda que coincide con la cadena de mensajes con la función C. Así que cuando se llama a un método de Objective C, lo que realmente sucede es que envíe una cadena de mensaje al objeto, y el objeto se parece a la función C asociado en la tabla de búsqueda de métodos de su clase y funciona eso.

Hay más a él con Objective C, como la forma de los objetos manejan mensajes que no entienden mediante el envío de ellos, la forma en que las búsquedas de caché-message-a método, y así sucesivamente, pero eso es lo básico.

C ++ es similar, excepto que en lugar de la clase que tiene una tabla de mensajes, se ha algo más llamado "vtable", y que invocar un método no a través de una cadena de texto, pero a través de su desplazamiento en la viable. Esta es una forma de unión estática, y acelera la ejecución algo, pero es menos flexible que el enlace dinámico.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top