Middle
Wie findet der Compiler die Methode, die aufgerufen werden soll?
sobes.tech KI
Antwort von AI
Der Compiler, beim Verarbeiten des Methodenaufrufs:
- Überprüft, ob die Methodendefinition in der Klasse und ihren Superklassen vorhanden ist.
- Bestimmt durch statische Typisierung (zur Compile-Zeit), welche Methode aufgerufen werden soll, falls möglich.
Während der Laufzeit:
- Wird ein Mechanismus der dynamischen Dispatch verwendet.
- Das Objekt hält einen Zeiger auf seine Klasse.
- Die Klasse hält eine Dispatch-Tabelle (method dispatch table), oder vtable in C++/Objective-C, oder eine Methodentabelle (method table) in Swift.
- Die Tabelle enthält Zeiger auf die Implementierungen der Methoden.
- Beim Aufruf einer Methode sucht die Laufzeitumgebung den entsprechenden Eintrag in der Dispatch-Tabelle der Klasse des Objekts anhand des Selektornamens (in Objective-C) oder der Methodensignatur (in Swift, für virtuelle Methoden).
- Nach Finden des Eintrags wird der Zeiger auf die Methodendurchführung aufgerufen.
In Objective-C sieht das so aus:
// Beispiel für einen Methodenaufruf in Objective-C
// [target messageName:parameter];
// Runtime sucht 'messageName:' in der Dispatch-Tabelle von 'target'.class
In Swift:
// Beispiel für einen Methodenaufruf in Swift
// instance.methodName(parameter)
// Abhängig vom Typ (final class, struct, protocol, dynamisch)
// wird statische oder dynamische Dispatch (vtable oder message dispatch) verwendet.
Arten des Dispatchings in Swift:
| Typ | Dispatch | Optimierung |
|---|---|---|
struct, enum |
Statisch | Der Compiler kennt die genaue Methode |
final class |
Statisch | Der Compiler kennt die genaue Methode |
class (nicht final) |
Virtuell | Über die Tabelle (vtable) |
protocol (ohne @objc) |
Virtuell | Über die Protokoll-Witness-Tabelle (protocol witness table) |
@objc (class, protocol) |
Dynamisch | Über den Objective-C-Laufzeit (message dispatch) |