Sobes.tech
Middle

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:

  1. 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 final ou private (se não houver @objc e não for usado despacho dinâmico via runtime do Objective-C).
    • Funções globais e estáticas.
    • Extensões.
  2. 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 final ou private.
    • 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")
        }
    }
    
  3. 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")
        }
    }
    

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.