Middle
Hogyan találja meg a fordító a hívni kívánt módszert?
sobes.tech MI
Válasz az MI-től
A fordító, a metódushívás feldolgozása során:
- Ellenőrzi, hogy a metódusdefiníció megtalálható-e az osztályban és szuperosztályaiban.
- Statikus típusosítás (a fordítás idején) segítségével meghatározza, hogy melyik metódus hívható meg, ha ez lehetséges.
Futás közben:
- Dinamikus elosztási mechanizmust alkalmaznak.
- A objektum tart egy mutatót a saját osztályára.
- Az osztály tart egy elosztási táblázatot (method dispatch table), vagy vtable-t C++/Objective-C-ben, vagy egy metódustáblát (method table) Swift-ben.
- A táblázat mutatókat tart a metódusok implementációira.
- A metódus hívásakor a futási környezet a objektum osztályának elosztási táblázatában keresi a megfelelő bejegyzést a szelektor név (Objective-C-ben) vagy a metódus szignatúrája (Swift, virtuális metódusok esetén) szerint.
- A bejegyzés megtalálása után a metódus implementációjára mutató hívódik.
Objective-C-ben ez így néz ki:
// Példa metódushívásra Objective-C-ben
// [target messageName:parameter];
// A futásidő 'messageName:'-t keres a 'target'.class elosztási táblázatában
Swift-ben:
// Példa metódushívásra Swift-ben
// instance.methodName(parameter)
// A típus (végső osztály, struktúra, protokoll, dinamikus) szerint
// statikus vagy dinamikus dispatch (vtable vagy message dispatch) használatos.
Swift típusú elosztási módszerek:
| Típus | Dispatch | Optimalizáció |
|---|---|---|
struct, enum |
Statikus | A fordító pontos metódust ismeri |
final class |
Statikus | A fordító pontos metódust ismeri |
class (nem final) |
Virtuális | Táblán keresztül (vtable) |
protocol (nem @objc) |
Virtuális | Protokoll tanú táblán keresztül |
@objc (class, protocol) |
Dinamikus | Objective-C runtime-on keresztül (message dispatch) |