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