Sobes.tech
Middle

Was ist Dispatching?

sobes.tech KI

Antwort von AI

Dispatch ist der Prozess, bei dem bestimmt wird, welche konkrete Methode oder Funktion während der Programmausführung ausgeführt wird.

In Swift gibt es drei Haupttypen des Dispatch:

  1. Statisch (statischer oder direkter Dispatch): Der schnellste Typ. Der Compiler weiß genau, welche Methode aufgerufen wird, zur Compile-Zeit. Es gibt keine zusätzlichen Kosten für die Suche nach der Methode. Wird angewendet auf:

    • Strukturen (struct).
    • Aufzählungen (enum).
    • Methoden in Klassen, die als final oder private markiert sind (wenn kein @objc und kein dynamischer Dispatch über den Objective-C Runtime verwendet wird).
    • Globale und statische Funktionen.
    • Erweiterungen (extension).
  2. Tabellarisch (Tabellen-Dispatch): Wird für Klassen verwendet. Für jede Klasse wird eine virtuelle Tabelle (vtable) erstellt, die Zeiger auf die Implementierungen der Methoden enthält. Beim Aufruf einer Methode wird der Zeiger in der Tabelle gesucht. Geringfügige zusätzliche Kosten. Wird angewendet auf:

    • Instanzmethoden von Klassen (Klassenmethoden), die nicht als final oder private markiert sind.
    • Berechnete Eigenschaften (computed properties).
    class Animal {
        func speak() { // Tabellen-Dispatch
            print("...")
        }
    }
    
    class Dog: Animal {
        override func speak() { // Überschriebene Methode, auch Tabellen-Dispatch
            print("Woof")
        }
    }
    
  3. Dynamisch (dynamischer Dispatch): Der langsamste Typ. Die Methodenauflösung erfolgt zur Laufzeit über den Objective-C Runtime. Wird für die Interaktion mit Objective-C verwendet. Hat erhebliche Kosten. Wird angewendet auf:

    • Methoden, die mit @objc dynamic markiert sind.
    • Eigenschaften, die mit @objc dynamic markiert sind.
    • Key-Value Observing (KVO).
    • Key-Value Coding (KVC).
    class SomeClass: NSObject {
        @objc dynamic func performAction() { // Dynamischer Dispatch
            print("Performing action")
        }
    }
    

Zusammenfassungstabelle:

Typ Geschwindigkeit Zusätzliche Kosten Wo angewendet
Statisch Hoch Gering Struct, Enum, final/private Methoden in Klassen, Extension
Tabellenbasiert Mittel Mittel Instanzmethoden von Klassen (nicht final/private)
Dynamisch Niedrig Hoch @objc dynamic

Die Wahl des Dispatch-Typs ist wichtig, um die Leistung zu optimieren. Swift wählt standardmäßig den effizientesten Typ, der die Flexibilität des Polymorphismus dort bewahrt, wo es notwendig ist (unter Verwendung des tabellarischen Dispatchs für Klassen). Die Verwendung von final oder private kann dem Compiler helfen, statischen Dispatch anzuwenden.