Sobes.tech
Middle

Como é que o compilador encontra o método que precisa de ser chamado?

sobes.tech IA

Resposta da IA

O compilador, ao processar a chamada de método:

  • Verifica a existência da definição do método na classe e nas suas superclasses.
  • Determina através de tipagem estática (em tempo de compilação) qual método deve ser chamado, se possível.

Durante a execução:

  • É utilizado um mecanismo de despacho dinâmico.
  • O objeto mantém um ponteiro para a sua classe.
  • A classe mantém uma tabela de despacho (method dispatch table), ou vtable em C++/Objective-C, ou uma tabela de métodos (method table) em Swift.
  • A tabela contém ponteiros para as implementações dos métodos.
  • Ao chamar um método, o ambiente de execução procura a entrada correspondente na tabela de despacho da classe do objeto pelo nome do seletor (em Objective-C) ou pela assinatura do método (em Swift, para métodos virtuais).
  • Ao encontrar a entrada, é chamado o ponteiro para a implementação do método.

Em Objective-C, isto parece assim:

// Exemplo de chamada de método em Objective-C
// [target messageName:parameter];
// O runtime procura 'messageName:' na tabela de despacho de 'target'.class

Em Swift:

// Exemplo de chamada de método em Swift
// instance.methodName(parameter)
// Dependendo do tipo (classe final, struct, protocolo, dinâmico)
// é utilizado despacho estático ou dinâmico (vtable ou message dispatch)

Tipos de despacho em Swift:

Tipo Despacho Otimização
struct, enum Estático O compilador conhece o método exato
final class Estático O compilador conhece o método exato
class (não final) Virtual Através da tabela (vtable)
protocol (sem @objc) Virtual Através da tabela de testemunhas de protocolo (protocol witness table)
@objc (class, protocol) Dinâmico Através do runtime Objective-C (message dispatch)