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