Ответ
Диспетчеризация (method dispatch) – это механизм, который определяет, какая конкретная реализация метода должна быть выполнена при его вызове. Это основа полиморфизма в ООП.
Основные типы в Swift/iOS:
| Тип диспетчеризации | Как работает | Преимущества | Недостатки | Пример в Swift |
|---|---|---|---|---|
| Статическая (Прямая) | Компилятор напрямую указывает адрес функции в машинном коде. | Максимальная скорость выполнения, оптимизация (inlining). | Отсутствие полиморфизма. | final методы, struct методы, глобальные функции. |
| Динамическая (Через таблицу) | Вызов идет через таблицу виртуальных методов (vtable) класса. Решение принимается в runtime. | Поддержка наследования и полиморфизма. | Небольшие накладные расходы на поиск в таблице. | Обычные методы class (не final). |
| Динамическая (Сообщения, Objective-C) | Используется механизм objc_msgSend. Можно добавлять/менять методы в runtime. |
Гибкость (KVO, swizzling). | Наибольшие накладные расходы. | Методы, помеченные @objc или dynamic. |
Практический пример полиморфизма через динамическую диспетчеризацию:
class Shape {
func draw() { print("Drawing a generic shape") } // Диспетчеризация через vtable
}
class Circle: Shape {
override func draw() { print("Drawing a circle") } // Своя запись в vtable
}
let shape: Shape = Circle() // Переменная типа Shape, значение типа Circle
shape.draw() // Выведет "Drawing a circle".
// Решение о вызове Circle.draw() принято в runtime благодаря динамической диспетчеризации.
Выбор типа диспетчеризации влияет на производительность и гибкость дизайна системы.