Sobes.tech
Intern

Wat gebeurt er als je naar het object toegaat?

sobes.tech AI

Antwoord van AI

Stuur een bericht naar een object. Als het object een methode met de juiste naam (selector) heeft, wordt deze uitgevoerd. Als dat niet het geval is, treedt er een runtime-fout op (onherkenbare selector gestuurd naar instantie), tenzij het object een berichtdoorstuurmechanisme implementeert.

Het berichtdoorstuurmechanisme in Objective-C/Swift bestaat uit verschillende stappen:

  1. Dynamische dispatch: De runtime zoekt de implementatie van de methode (IMP) voor die selector in de klasse van het object en zijn superklassen.
  2. Dynamisch toevoegen van methoden: Als de implementatie niet wordt gevonden, roept de runtime de methode +resolveInstanceMethod: (voor instanties) of +resolveClassMethod: (voor klassen) aan, om de klasse de mogelijkheid te geven om de methode dynamisch toe te voegen.
  3. Berichtdoorsturing: Als de methode nog steeds niet gevonden of toegevoegd is, probeert de runtime het bericht door te sturen naar een ander object, door de methoden forwardingTargetForSelector: en vervolgens methodSignatureForSelector: en forwardInvocation: aan te roepen.

Als geen van deze stappen het bericht behandelt, treedt een uitzondering NSInvalidArgumentException op.

Voorbeeld in Objective-C:

@implementation MyObject

- (void)myMethod {
    // Implementatie van de methode
    NSLog(@"myMethod called");
}

@end

// ...
MyObject *obj = [[MyObject alloc] init];
[obj myMethod]; // Bericht sturen

Voorbeeld in Swift (impliciet):

class MySwiftObject {
    func mySwiftMethod() {
        // Implementatie van de methode
        print("mySwiftMethod called")
    }
}

let swiftObj = MySwiftObject()
swiftObj.mySwiftMethod() // Bericht sturen (via dynamische dispatch standaard)

De toegang tot objecteigenschappen in Swift gebruikt standaard statische dispatch voor let en var zonder @objc dynamic. Als een eigenschap echter is gemarkeerd als @objc dynamic, wordt ook de dynamische dispatch gebruikt, vergelijkbaar met het verzenden van berichten in Objective-C.