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