Sobes.tech
Intern

Was passiert, wenn auf das Objekt zugegriffen wird?

sobes.tech KI

Antwort von AI

Nachricht an ein Objekt senden. Wenn das Objekt eine Methode mit dem entsprechenden Namen (Selector) hat, wird diese ausgeführt. Wenn nicht, tritt ein Laufzeitfehler auf (unbekannter Selector an Instanz gesendet), es sei denn, das Objekt implementiert einen Mechanismus zur Nachrichtenweiterleitung.

Der Nachrichtenweiterleitungsmechanismus in Objective-C/Swift besteht aus mehreren Schritten:

  1. Dynamische Dispatch: Die Laufzeitumgebung sucht die Implementierung der Methode (IMP) für diesen Selector in der Klasse des Objekts und seinen Superklassen.
  2. Dynamisches Hinzufügen von Methoden: Wenn die Implementierung nicht gefunden wird, ruft die Laufzeitmethode +resolveInstanceMethod: (für Instanzen) oder +resolveClassMethod: (für Klassen) auf, um der Klasse die Möglichkeit zu geben, die Methode dynamisch hinzuzufügen.
  3. Nachrichtenweiterleitung: Wenn die Methode immer noch nicht gefunden oder hinzugefügt wurde, versucht die Laufzeit, die Nachricht an ein anderes Objekt weiterzuleiten, indem sie die Methoden forwardingTargetForSelector: und dann methodSignatureForSelector: und forwardInvocation: aufruft.

Wenn keiner dieser Schritte die Nachricht verarbeitet, tritt eine Ausnahme NSInvalidArgumentException auf.

Beispiel in Objective-C:

@implementation MyObject

- (void)myMethod {
    // Methodendefinition
    NSLog(@"myMethod called");
}

@end

// ...
MyObject *obj = [[MyObject alloc] init];
[obj myMethod]; // Nachricht senden

Beispiel in Swift (implizit):

class MySwiftObject {
    func mySwiftMethod() {
        // Methodendefinition
        print("mySwiftMethod called")
    }
}

let swiftObj = MySwiftObject()
swiftObj.mySwiftMethod() // Nachricht senden

Der Zugriff auf Objekt-Eigenschaften in Swift verwendet standardmäßig statischen Dispatch für let und var ohne @objc dynamic. Wenn eine Eigenschaft jedoch als @objc dynamic markiert ist, wird auch der dynamische Dispatch verwendet, ähnlich wie bei der Nachrichtenübermittlung in Objective-C.