Middle
¿Cómo encuentra el compilador el método que debe llamar?
sobes.tech AI
Respuesta de la IA
Compilador, al procesar la llamada a un método:
- Verifica la existencia de la definición del método en la clase y en sus superclases.
- Determina mediante tipificación estática (en tiempo de compilación) qué método debe ser llamado, si es posible.
Durante la ejecución:
- Se utiliza un mecanismo de despacho dinámico.
- El objeto mantiene un puntero a su clase.
- La clase mantiene una tabla de despacho (method dispatch table), o vtable en C++/Objective-C, o una tabla de métodos (method table) en Swift.
- La tabla contiene punteros a las implementaciones de los métodos.
- Al llamar a un método, el entorno de ejecución busca la entrada correspondiente en la tabla de despacho de la clase del objeto por el nombre del selector (en Objective-C) o por la firma del método (en Swift, para métodos virtuales).
- Al encontrar la entrada, se llama al puntero a la implementación del método.
En Objective-C esto se ve así:
// Ejemplo de llamada a un método en Objective-C
// [target messageName:parameter];
// El runtime busca 'messageName:' en la tabla de despacho de 'target'.class
En Swift:
// Ejemplo de llamada a un método en Swift
// instance.methodName(parameter)
// Dependiendo del tipo (clase final, struct, protocolo, dinámico)
// se utiliza despacho estático o dinámico (vtable o message dispatch)
Tipos de despacho en Swift:
| Tipo | Despacho | Optimización |
|---|---|---|
struct, enum |
Estático | El compilador conoce el método exacto |
final class |
Estático | El compilador conoce el método exacto |
class (no final) |
Virtual | A través de la tabla (vtable) |
protocol (sin @objc) |
Virtual | A través de la tabla de protocolos (protocol witness table) |
@objc (class, protocol) |
Dinámico | A través del runtime de Objective-C (message dispatch) |