Sobes.tech
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)