Sobes.tech
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)