Диспетчеризация — это процесс определения, какой конкретно метод или функция будет выполняться во время выполнения программы.
В Swift существуют три основных типа диспетчеризации:
Статическая (Static or Direct Dispatch): Самый быстрый тип. Компилятор точно знает, какой метод будет вызван, на этапе компиляции. Нет накладных расходов на поиск метода. Применяется для:
final или private (если нет @objc и не используется динамическая диспетчеризация через Objective-C runtime).Табличная (Table Dispatch): Используется для классов. Для каждого класса создается виртуальная таблица (vtable), содержащая указатели на реализации методов. При вызове метода происходит поиск указателя в таблице. Есть небольшие накладные расходы. Применяется для:
final или private.swift
Динамическая (Dynamic Dispatch): Самая медленная. Разрешение метода происходит во время выполнения через Objective-C runtime. Используется для взаимодействия с Objective-C. Имеет значительные накладные расходы. Применяется для:
@objc dynamic.@objc dynamic.swift
Сводная таблица:
| Тип | Скорость | Накладные расходы | Где применяется |
|---|---|---|---|
| Статическая | Высокая | Низкие | Struct, Enum, final/private методы классов, extension |
| Табличная | Средняя | Средние | Методы экземпляров классов (не final/private) |
| Динамическая | Низкая | Высокие | @objc dynamic |
Выбор типа диспетчеризации важен для оптимизации производительности. Swift по умолчанию выбирает наиболее производительный тип, позволяющий сохранить гибкость полиморфизма там, где это необходимо (используя табличную диспетчеризацию для классов). Использование final или private может помочь компилятору применять статическую диспетчеризацию.