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:
- 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.
- 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. - Ü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 amethodSignatureForSelector:ésforwardInvocation: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.