O que é despacho?
sobes.tech IA
Resposta da IA
A despacho é o processo de determinar qual método ou função específica será executada durante a execução do programa.
Em Swift, existem três tipos principais de despacho:
-
Estático (Despacho estático ou direto): O mais rápido. O compilador sabe exatamente qual método será chamado na fase de compilação. Não há custos adicionais para procurar o método. Aplica-se a:
- Estruturas (struct).
- Enumerações (enum).
- Métodos em classes marcados como
finalouprivate(se não houver@objce não for usado despacho dinâmico via runtime do Objective-C). - Funções globais e estáticas.
- Extensões.
-
De tabela (Despacho de tabela): Usado para classes. Para cada classe, é criada uma tabela virtual (vtable) contendo ponteiros para as implementações dos métodos. Ao chamar um método, o ponteiro é procurado na tabela. Tem custos adicionais menores. Aplica-se a:
- Métodos de instância de classes (métodos de classe), não marcados como
finalouprivate. - Propriedades calculadas.
class Animal { func speak() { // Despacho de tabela print("...") } } class Dog: Animal { override func speak() { // Método sobrescrito, também despacho de tabela print("Woof") } } - Métodos de instância de classes (métodos de classe), não marcados como
-
Dinâmico (Despacho dinâmico): O mais lento. A resolução do método ocorre em tempo de execução através do runtime do Objective-C. Usado para interagir com Objective-C. Tem custos significativos. Aplica-se a:
- Métodos marcados como
@objc dynamic. - Propriedades marcadas como
@objc dynamic. - Observação de Valor-Chave (KVO).
- Codificação de Valor-Chave (KVC).
class SomeClass: NSObject { @objc dynamic func performAction() { // Despacho dinâmico print("Performing action") } } - Métodos marcados como
Tabela resumida:
| Tipo | Velocidade | Custos adicionais | Onde se aplica |
|---|---|---|---|
| Estático | Alto | Baixos | Struct, Enum, métodos final/private em classes, extensão |
| De tabela | Médio | Médios | Métodos de instância de classes (não final/private) |
| Dinâmico | Baixo | Altos | @objc dynamic |
A escolha do tipo de despacho é importante para otimizar o desempenho. Swift escolhe por padrão o tipo mais eficiente que permite manter a flexibilidade do polimorfismo onde for necessário (usando despacho de tabela para classes). O uso de final ou private pode ajudar o compilador a aplicar despacho estático.