Sobes.tech
Intern

Mi történik, ha hozzáférünk a tárgyhoz?

sobes.tech MI

Válasz az MI-től

Üzenet küldése egy objektumnak. Ha az objektumnak van a megfelelő névvel (selector) metódusa, akkor az végrehajtódik. Ha nincs, futásidejű hiba történik (nem ismert selector küldése az példánynak), kivéve, ha az objektum megvalósít egy üzenetátirányítási mechanizmust.

Az Objective-C/Swift üzenetátirányítási mechanizmusa több lépésből áll:

  1. Dinamikus elosztás: A futási környezet megkeresi a módszer (IMP) implementációját az adott selectorhoz az objektum osztályában és szuperosztályaiban.
  2. Dinamikus módszer hozzáadás: Ha nem található az implementáció, a futási környezet meghívja a +resolveInstanceMethod: (példányokra) vagy +resolveClassMethod: (osztályokra) metódust, hogy lehetőséget adjon az osztálynak a módszer dinamikus hozzáadására.
  3. Üzenet átirányítás: Ha a módszert még mindig nem találják vagy nem adják hozzá, a futási környezet megpróbálja átirányítani az üzenetet egy másik objektumra, a forwardingTargetForSelector: majd a methodSignatureForSelector: és forwardInvocation: metódusokat hívva.

Ha egyik lépés sem kezeli az üzenetet, kivétel keletkezik NSInvalidArgumentException formájában.

Példa Objective-C-ben:

@implementation MyObject

- (void)myMethod {
    // Metódus implementáció
    NSLog(@"myMethod called");
}

@end

// ...
MyObject *obj = [[MyObject alloc] init];
[obj myMethod]; // Üzenet küldése

Példa Swift-ben (implicit):

class MySwiftObject {
    func mySwiftMethod() {
        // Metódus implementáció
        print("mySwiftMethod called")
    }
}

let swiftObj = MySwiftObject()
swiftObj.mySwiftMethod() // Üzenet küldése (alapértelmezett dinamikus dispatch segítségével)

Swiftben az objektum tulajdonságaihoz való hozzáférés alapértelmezés szerint statikus dispatchot használ a let és var esetén @objc dynamic nélkül. Ha azonban a tulajdonság @objc dynamic-ként van megjelölve, akkor a hozzáférés is dinamikus dispatchot fog használni, hasonlóan az Objective-C-ben történő üzenetküldéshez.