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) |