Что такое диспетчеризация методов и зачем она нужна?

«Что такое диспетчеризация методов и зачем она нужна?» — вопрос из категории ООП, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Диспетчеризация (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 благодаря динамической диспетчеризации.

Выбор типа диспетчеризации влияет на производительность и гибкость дизайна системы.