Middle
50
questionbank

Как компилятор находит метод, который необходимо вызвать?

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

Компилятор, обрабатывая вызов метода:

  • Проверяет наличие определения метода в классе и его суперклассах.
  • Определяет с помощью статической типизации (во время компиляции), какой именно метод должен быть вызван, если это возможно.

Во время выполнения:

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

В Objective-C это выглядит так:

objective

В Swift:

swift

Типы диспетчеризации в Swift:

ТипДиспетчеризацияОптимизация
struct, enumСтатическаяКомпилятор знает точный метод
final classСтатическаяКомпилятор знает точный метод
class (не final)ВиртуальнаяЧерез таблицу (vtable)
protocol (без @objc)ВиртуальнаяЧерез таблицу протокола (protocol witness table)
@objc (class, protocol)ДинамическаяЧерез Objective-C runtime (message dispatch)