Sobes.tech
Intern

Co se stane, když se na objekt odkáže?

sobes.tech AI

Odpověď od AI

Odešlete zprávu objektu. Pokud má objekt metodu se stejným názvem (selektor), bude provedena. Pokud ne, dojde k chybě za běhu (neuznávaný selektor odeslaný instanci), pokud objekt neimplementuje mechanismus přeposílání zpráv.

Mechanismus přeposílání zpráv v Objective-C/Swift se skládá z několika kroků:

  1. Dynamické směrování: Prostředí běhu hledá implementaci metody (IMP) pro daný selektor ve třídě objektu a jeho supertřídách.
  2. Dynamické přidání metod: Pokud implementace není nalezena, prostředí běhu volá metodu +resolveInstanceMethod: (pro instance) nebo +resolveClassMethod: (pro třídy), aby umožnilo třídě dynamicky přidat implementaci metody.
  3. Přeposílání zpráv: Pokud metoda stále není nalezena nebo přidána, prostředí běhu se pokusí přeposlat zprávu jinému objektu voláním metod forwardingTargetForSelector: a poté methodSignatureForSelector: a forwardInvocation:.

Pokud žádný z těchto kroků nezpracuje zprávu, dojde k výjimce NSInvalidArgumentException.

Příklad v Objective-C:

@implementation MyObject

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

@end

// ...
MyObject *obj = [[MyObject alloc] init];
[obj myMethod]; // Odeslání zprávy myMethod

Příklad v Swift (nepovinný):

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

let swiftObj = MySwiftObject()
swiftObj.mySwiftMethod() // Odeslání zprávy mySwiftMethod (přes výchozí dynamické směrování)

Přístup ke vlastnostem objektu v Swift ve výchozím nastavení používá statické směrování pro let a var bez @objc dynamic. Pokud je však vlastnost označena jako @objc dynamic, její přístup bude také používat dynamické směrování, podobně jako odesílání zpráv v Objective-C.