Sobes.tech
Intern

Čo sa stane, ak sa na objekt odvoláte?

sobes.tech AI

Odpoveď od AI

Pošlite správu objektu. Ak má objekt metódu s príslušným názvom (selektorom), bude vykonaná. Ak nie, dôjde k chybe za behu (neuznávaný selektor odoslaný inštancii), pokiaľ objekt neimplementuje mechanizmus presmerovania správ.

Mechanizmus presmerovania správ v Objective-C/Swift pozostáva z niekoľkých krokov:

  1. Dynamické rozdeľovanie: Prostredie behu hľadá implementáciu metódy (IMP) pre daný selektor v triede objektu a jeho nadtriedach.
  2. Dynamické pridanie metód: Ak implementácia nie je nájdená, prostredie behu volá metódu +resolveInstanceMethod: (pre inštancie) alebo +resolveClassMethod: (pre triedy), aby umožnilo triede dynamicky pridať implementáciu metódy.
  3. Presmerovanie správ: Ak metóda stále nie je nájdená alebo pridaná, prostredie behu sa pokúša presmerovať správu na iný objekt volaním metód forwardingTargetForSelector: a následne methodSignatureForSelector: a forwardInvocation:.

Ak žiadny z týchto krokov nevedie k spracovaniu správy, nastáva výnimka NSInvalidArgumentException.

Príklad v Objective-C:

@implementation MyObject

- (void)myMethod {
    // Implementácia metódy
    NSLog(@"myMethod called");
}

@end

// ...
MyObject *obj = [[MyObject alloc] init];
[obj myMethod]; // Odoslanie správy

Príklad v Swift (implicitne):

class MySwiftObject {
    func mySwiftMethod() {
        // Implementácia metódy
        print("mySwiftMethod called")
    }
}

let swiftObj = MySwiftObject()
swiftObj.mySwiftMethod() // Odoslanie správy mySwiftMethod (cez predvolené dynamické dispatch)

Prístup k vlastnostiam objektu v Swift po predvolenom nastavení používa statický dispatch pre let a var bez @objc dynamic. Ak je však vlastnosť označená ako @objc dynamic, jej prístup bude tiež využívať dynamický dispatch, podobne ako odosielanie správ v Objective-C.