Sobes.tech
Middle

Hoe vindt de compiler de methode die moet worden opgeroepen?

sobes.tech AI

Antwoord van AI

De compiler, bij het verwerken van de methodeaanroep:

  • Controleert of de definitie van de methode bestaat in de klasse en zijn superklassen.
  • Bepaalt via statische typisering (tijdens compilatie) welke methode moet worden aangeroepen, indien mogelijk.

Tijdens uitvoering:

  • Wordt een mechanisme van dynamische dispatch gebruikt.
  • Het object houdt een pointer naar zijn klasse.
  • De klasse houdt een dispatch-tabel (method dispatch table), of vtable in C++/Objective-C, of een methodentabel (method table) in Swift.
  • De tabel bevat pointers naar de implementaties van methoden.
  • Bij het aanroepen van een methode zoekt de uitvoeringsomgeving de juiste invoer in de dispatch-tabel van de klasse van het object op basis van de selector-naam (in Objective-C) of de methodesignature (in Swift, voor virtuele methoden).
  • Bij het vinden van de invoer wordt de pointer naar de implementatie van de methode aangeroepen.

In Objective-C ziet dat er zo uit:

// Voorbeeld van een method aanroep in Objective-C
// [target messageName:parameter];
// Runtime zoekt 'messageName:' in de dispatch-tabel van 'target'.class

In Swift:

// Voorbeeld van een method aanroep in Swift
// instance.methodName(parameter)
// Afhankelijk van het type (final class, struct, protocol, dynamisch)
// wordt statisch of dynamisch dispatch gebruikt (vtable of message dispatch)

Types van dispatch in Swift:

Type Dispatch Optimalisatie
struct, enum Statisch De compiler kent de exacte methode
final class Statisch De compiler kent de exacte methode
class (niet final) Virtueel Via tabel (vtable)
protocol (zonder @objc) Virtueel Via de protocol witness table
@objc (class, protocol) Dynamisch Via Objective-C runtime (message dispatch)