Sobes.tech
Middle

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

sobes.tech AI

Отговор от AI

Компилаторът, обработвайки извикването на метод:

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

По време на изпълнение:

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

В Objective-C това изглежда така:

// Пример за извикване на метод в Objective-C
// [target messageName:parameter];
// Runtime търси 'messageName:' в таблицата за маршрутизиране на 'target'.class

В Swift:

// Пример за извикване на метод в Swift
// instance.methodName(parameter)
// В зависимост от типа (финален клас, структура, протокол, динамичен)
// се използва статично или динамично маршрутизиране (vtable или message dispatch)

Видове маршрутизиране в Swift:

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