Компилятор, обрабатывая вызов метода:
- Проверяет наличие определения метода в классе и его суперклассах.
- Определяет с помощью статической типизации (во время компиляции), какой именно метод должен быть вызван, если это возможно.
Во время выполнения:
- Используется механизм динамической диспетчеризации.
- Объект хранит указатель на свой класс.
- Класс хранит таблицу диспетчеризации (method dispatch table), или vtable в C++/Objective-C, или таблицу методов (method table) в Swift.
- Таблица содержит указатели на реализации методов.
- При вызове метода, среда выполнения ищет соответствующую запись в таблице диспетчеризации класса объекта по имени селектора (в Objective-C) или сигнатуре метода (в Swift, для виртуальных методов).
- Найдя запись, вызывается указатель на реализацию метода.
В Objective-C это выглядит так:
objective