Sobes.tech
Middle

Čo je dispatching?

sobes.tech AI

Odpoveď od AI

Dispečerizácia je proces určenia, ktorá konkrétna metóda alebo funkcia bude vykonaná počas behu programu.

V Swift existujú tri hlavné typy dispečerizácie:

  1. Statická (Static alebo Direct Dispatch): Najrýchlejší typ. Kompilátor presne vie, ktorá metóda bude volaná v čase kompilácie. Nie sú žiadne náklady na hľadanie metódy. Používa sa pre:

    • Štruktúry (struct).
    • Enum.
    • Metódy v triedach označených ako final alebo private (ak nie je použitý @objc a nevyužíva sa dynamická dispečerizácia cez Objective-C runtime).
    • Globálne a statické funkcie.
    • Rozšírenia (extension).
  2. Tabuľková (Table Dispatch): Používa sa pre triedy. Pre každú triedu je vytvorená virtuálna tabuľka (vtable), ktorá obsahuje ukazovatele na implementácie metód. Pri volaní metódy sa hľadá ukazovateľ v tabuľke. Má malé náklady. Používa sa pre:

    • Metódy inštancií tried (class methods), ktoré nie sú označené ako final alebo private.
    • Vypočítavané vlastnosti (computed properties).
    class Animal {
        func speak() { // Tabuľková dispečerizácia
            print("...")
        }
    }
    
    class Dog: Animal {
        override func speak() { // Prepisovaná metóda, tiež tabuľková dispečerizácia
            print("Woof")
        }
    }
    
  3. Dynamická (Dynamic Dispatch): Najpomalšia. Rozhodnutie o metóde sa robí počas behu cez Objective-C runtime. Používa sa na interakciu s Objective-C. Má významné náklady. Používa sa pre:

    • Metódy označené ako @objc dynamic.
    • Vlastnosti označené ako @objc dynamic.
    • KVO (Key-Value Observing).
    • KVC (Key-Value Coding).
    class SomeClass: NSObject {
        @objc dynamic func performAction() { // Dynamická dispečerizácia
            print("Performing action")
        }
    }
    

Sumárna tabuľka:

Typ Rýchlosť Náklady Kde sa používa
Statická Vysoká Nízke Struct, Enum, final/private metódy tried, extension
Tabuľková Stredná Stredné Metódy inštancií tried (ne final/private)
Dynamická Nízka Vysoké @objc dynamic

Výber typu dispečera je dôležitý pre optimalizáciu výkonu. Swift predvolený výber je najefektívnejší typ, ktorý umožňuje zachovať flexibilitu polymorfizmu tam, kde je to potrebné (použitím tabuľkovej dispečerskej metódy pre triedy). Použitie final alebo private môže pomôcť kompilátoru použiť statickú dispečerskú metódu.