Č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:
- Dynamické rozdeľovanie: Prostredie behu hľadá implementáciu metódy (IMP) pre daný selektor v triede objektu a jeho nadtriedach.
- 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. - 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áslednemethodSignatureForSelector:aforwardInvocation:.
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.