Ответ
Диспетчеризацию методов можно разделить на два типа:
- Статическая, или Direct Dispatch. Нужную реализацию выбирают на этапе компиляции и сразу делают прямой вызов метода.
- Динамическая, или Dynamic Dispatch. Нужную реализацию выбирают во время выполнения.
Динамическая диспетчеризация в свою очередь делится на:
- Virtual Table. У каждого класса есть таблица с адресами методов, и все его экземпляры смотрят в нее. Если метод переопределен, в таблице наследника адрес заменяется на новую реализацию.
- Witness Table. Таблица для пары тип + протокол. По ней ищут реализацию требования, если вызов идет через тип протокола.
- Message Dispatch. Поиск метода по селектору в runtime Objective-C, например у методов с
@objc dynamic.