Sobes.tech
Middle

Šta je dispatching?

sobes.tech АИ

Одговор од АИ

Диспетчеризација је процес одређивања која ће конкретна метода или функција бити извршена током извршавања програма.

У Swift-у постоје три главна типа диспетчеризације:

  1. Статичка (Static или Direct Dispatch): Најбржа врста. Компилатор тачно зна која ће метода бити позвана у време компилације. Нема трошкова за претрагу методе. Примењује се за:

    • Структуре (struct).
    • Enum.
    • Метода у класама означеним као final или private (ако нема @objc и не користи се динамичка диспетчеризација преко Objective-C runtime-а).
    • Глобалне и статичке функције.
    • Екстензије (extension).
  2. Таблична (Table Dispatch): Користи се за класе. За сваки клас се креира виртуелна табела (vtable), која садржи показиваче на реализације метода. При позиву метода се тражи показивач у табели. Има мале трошкове. Примењује се за:

    • Метода инстанци класа (class methods), које нису означене као final или private.
    • Израчунавајућа својства (computed properties).
    class Animal {
        func speak() { // Таблична диспетчеризација
            print("...")
        }
    }
    
    class Dog: Animal {
        override func speak() { // Презаписана метода, такође таблична диспетчеризација
            print("Woof")
        }
    }
    
  3. Динамичка (Dynamic Dispatch): Најспорија. Одлука о методи се доноси током извршавања преко Objective-C runtime-а. Користи се за интеракцију са Objective-C. Има значајне трошкове. Примењује се за:

    • Метода означена као @objc dynamic.
    • Свойства означена као @objc dynamic.
    • KVO (Key-Value Observing).
    • KVC (Key-Value Coding).
    class SomeClass: NSObject {
        @objc dynamic func performAction() { // Динамичка диспетчеризација
            print("Performing action")
        }
    }
    

Сажета табела:

Тип Брзина Трошкови Где се користи
Статичка Висока Низки Struct, Enum, final/private методи класа, extension
Таблична Средња Средњи Методи инстанци класа (не final/private)
Динамичка Ниска Високи @objc dynamic

Избор типа диспетчеризације је важан за оптимизацију перформанси. Swift по подразумевану бира најефикаснији тип који омогућава одржавање флексибилности полиморфизма тамо где је то потребно (коришћењем табличне диспетчеризације за класе). Коришћење final или private може помоћи компајлеру да примени статичку диспетчеризацију.