Middle
Ako nájde prekladať metódu, ktorú je potrebné zavolať?
sobes.tech AI
Odpoveď od AI
Kompilátor, pri spracovaní volania metódy:
- Kontroluje, či definícia metódy existuje v triede a jej supertriedach.
- Určuje pomocou statického typovania (počas kompilácie), ktorá metóda má byť volaná, ak je to možné.
Počas behu:
- Používa sa mechanizmus dynamického smerovania.
- Objekt si uchováva ukazovateľ na svoju triedu.
- Trieda si uchováva tabuľku smerovania (method dispatch table), alebo vtable v C++/Objective-C, alebo tabuľku metód (method table) v Swift.
- Tabuľka obsahuje ukazovatele na implementácie metód.
- Pri volaní metódy vyhľadáva prostredie behu zodpovedajúci záznam v tabuľke smerovania triedy objektu podľa mena selektora (v Objective-C) alebo podľa podpisu metódy (v Swift, pre virtuálne metódy).
- Nájdúc záznam, sa volá ukazovateľ na implementáciu metódy.
V Objective-C to vyzerá takto:
// Príklad volania metódy v Objective-C
// [target messageName:parameter];
// Runtime hľadá 'messageName:' v tabuľke smerovania 'target'.class
V Swift:
// Príklad volania metódy v Swift
// instance.methodName(parameter)
// V závislosti od typu (final trieda, štruktúra, protokol, dynamický)
// sa používa statické alebo dynamické smerovanie (vtable alebo message dispatch)
Typy smerovania v Swift:
| Typ | Smerovanie | Optimalizácia |
|---|---|---|
struct, enum |
Statické | Kompilátor pozná presnú metódu |
final class |
Statické | Kompilátor pozná presnú metódu |
class (ne final) |
Virtuálne | Cez tabuľu (vtable) |
protocol (bez @objc) |
Virtuálne | Cez tabuľu svedkov protokolu (protocol witness table) |
@objc (class, protocol) |
Dynaické | Cez runtime Objective-C (message dispatch) |