Sobes.tech
Middle

Jak najde překladač metodu, kterou je třeba zavolat?

sobes.tech AI

Odpověď od AI

Kompilátor, při zpracování volání metody:

  • Kontroluje, zda definice metody existuje v třídě a jejích supertřídách.
  • Určuje pomocí statického typování (během kompilace), která metoda má být volána, pokud je to možné.

Během běhu:

  • Používá se mechanismus dynamického směrování.
  • Objekt uchovává ukazatel na svou třídu.
  • Třída uchovává tabulku směrování (method dispatch table), nebo vtable v C++/Objective-C, nebo tabulku metod (method table) ve Swift.
  • Tabulka obsahuje ukazatele na implementace metod.
  • Při volání metody hledá prostředí běhu odpovídající záznam v tabulce směrování třídy objektu podle jména selektoru (v Objective-C) nebo podle podpisu metody (ve Swift, pro virtuální metody).
  • Po nalezení záznamu je volán ukazatel na implementaci metody.

V Objective-C to vypadá takto:

// Příklad volání metody v Objective-C
// [target messageName:parameter];
// Runtime hledá 'messageName:' v tabulce směrování 'target'.class

V Swift:

// Příklad volání metody ve Swift
// instance.methodName(parameter)
// V závislosti na typu (final třída, struktura, protokol, dynamický)
// se používá statické nebo dynamické směrování (vtable nebo message dispatch)

Typy směrování ve Swift:

Typ Směrování Optimalizace
struct, enum Statické Kompilátor zná přesnou metodu
final class Statické Kompilátor zná přesnou metodu
class (ne final) Virtuální Přes tabulku (vtable)
protocol (bez @objc) Virtuální Přes tabulku svědků protokolu
@objc (class, protocol) Dynaické Přes runtime Objective-C (message dispatch)