Middle
30
0
questionbank

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

Answer from sobes.tech neural network

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

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

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

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

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

objective

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

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

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

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

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

objective

Register or sign in to get access to full answers for all questions from the question bank.

method-dispatchbindingpolymorphismruntimeinheritancevirtual-method