Sobes.tech
Middle

¿Qué es la despacho?

sobes.tech AI

Respuesta de la IA

La despacho es el proceso de determinar qué método o función específica se ejecutará durante la ejecución del programa.

En Swift, existen tres tipos principales de despacho:

  1. Estático (Despliegue estático o directo): El más rápido. El compilador sabe exactamente qué método será llamado en tiempo de compilación. No hay costos adicionales para buscar el método. Se aplica a:

    • Estructuras (struct).
    • Enumeraciones (enum).
    • Métodos en clases marcados como final o private (si no hay @objc y no se usa despacho dinámico a través del runtime de Objective-C).
    • Funciones globales y estáticas.
    • Extensiones (extension).
  2. Tabular (Despacho de tabla): Se usa para clases. Se crea una tabla virtual (vtable) para cada clase, que contiene punteros a las implementaciones de los métodos. Al llamar a un método, se busca el puntero en la tabla. Tiene costos adicionales menores. Se aplica a:

    • Métodos de instancia de clases (métodos de clase), no marcados como final o private.
    • Propiedades calculadas (computed properties).
    class Animal {
        func speak() { // Despacho de tabla
            print("...")
        }
    }
    
    class Dog: Animal {
        override func speak() { // Método sobrescrito, también despacho de tabla
            print("Woof")
        }
    }
    
  3. Dinámico (Despacho dinámico): El más lento. La resolución del método ocurre en tiempo de ejecución a través del runtime de Objective-C. Se usa para interactuar con Objective-C. Tiene costos significativos. Se aplica a:

    • Métodos marcados como @objc dynamic.
    • Propiedades marcadas como @objc dynamic.
    • Observación de valor clave (KVO).
    • Codificación de valor clave (KVC).
    class SomeClass: NSObject {
        @objc dynamic func performAction() { // Despacho dinámico
            print("Performing action")
        }
    }
    

Tabla resumen:

Tipo Velocidad Costos adicionales Dónde se aplica
Estático Alto Bajos Struct, Enum, métodos final/private en clases, extensión
Tabular Medio Medios Métodos de instancia de clases (no final/private)
Dinámico Bajo Altos @objc dynamic

La elección del tipo de despacho es importante para optimizar el rendimiento. Swift selecciona por defecto el tipo más eficiente que permite mantener la flexibilidad del polimorfismo donde sea necesario (usando despacho tabular para clases). El uso de final o private puede ayudar al compilador a aplicar despacho estático.