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) |