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ů:
- Dynamické směrování: Prostředí běhu hledá implementaci metody (IMP) pro daný selektor ve třídě objektu a jeho supertřídách.
- 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. - 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:aforwardInvocation:.
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.