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