Sobes.tech
Middle

Co je to dispatching?

sobes.tech AI

Odpověď od AI

Dispečerský systém je proces určení, která konkrétní metoda nebo funkce bude během běhu programu vykonána.

Ve Swiftu existují tři hlavní typy dispečerského řízení:

  1. Statické (Static nebo Direct Dispatch): Nejrychlejší typ. Kompilátor přesně ví, která metoda bude volána při kompilaci. Není žádná režie za hledání metody. Používá se pro:

    • Struktury (struct).
    • Enumy (enum).
    • Metody ve třídách označených jako final nebo private (pokud není použit @objc a není využíváno dynamické dispečování přes Objective-C runtime).
    • Globální a statické funkce.
    • Rozšíření (extension).
  2. Tabulkové (Table Dispatch): Používá se pro třídy. Pro každou třídu je vytvořena virtuální tabulka (vtable), která obsahuje ukazatele na implementace metod. Při volání metody se hledá ukazatel v tabulce. Má malou režii. Používá se pro:

    • Metody instancí tříd (class methods), které nejsou označeny jako final nebo private.
    • Vypočítané vlastnosti (computed properties).
    class Animal {
        func speak() { // Tabulkové dispečování
            print("...")
        }
    }
    
    class Dog: Animal {
        override func speak() { // Přepsaná metoda, také tabulkové dispečování
            print("Woof")
        }
    }
    
  3. Dynamické (Dynamic Dispatch): Nejpomalejší. Rozhodnutí o metodě se děje za běhu přes Objective-C runtime. Používá se pro interakci s Objective-C. Má významné režie. Používá se pro:

    • Metody označené jako @objc dynamic.
    • Vlastnosti označené jako @objc dynamic.
    • KVO (Key-Value Observing).
    • KVC (Key-Value Coding).
    class SomeClass: NSObject {
        @objc dynamic func performAction() { // Dynamické dispečování
            print("Performing action")
        }
    }
    

Souhrnná tabulka:

Typ Rychlost Režie Kde se používá
Statické Vysoká Nízká Struct, Enum, final/private metody tříd, extension
Tabulkové Střední Střední Metody instancí tříd (ne final/private)
Dynamické Nízká Vysoké @objc dynamic

Výběr typu dispečeru je důležitý pro optimalizaci výkonu. Swift výchozí volba je nejvýkonnější typ, který umožňuje zachovat flexibilitu polymorfismu tam, kde je to potřeba (použitím tabulkového dispečeru pro třídy). Použití final nebo private může pomoci kompilátoru použít statické dispečování.