Intern
Mis juhtub, kui pöördute objekti poole?
sobes.tech AI
Vastus AI-lt
Sõnum saadetakse objekti. Kui objektil on vastava nimega (selektori) meetod, siis see täidetakse. Kui mitte, toimub täitmise viga (unrecognized selector sent to instance), välja arvatud juhul, kui objekt ei rakenda sõnumite edastamise mehhanismi:
Sõnumite edastamise mehhanism Objective-C/Swiftis koosneb mitmest etapist:
- Dünaamiline dispetcher: täitmise keskkond otsib meetodi (IMP) realiseerimist selle selektori jaoks objekti klassis ja selle superklassides.
- Dünaamiline meetodite lisamine: Kui realiseerimist ei leita, kutsub täitmise keskkond välja
+resolveInstanceMethod:(näidiste jaoks) või+resolveClassMethod:(klasside jaoks), andes klassile võimaluse meetodi realiseerimist dünaamiliselt lisada. - Sõnumite edastamine: Kui meetod ikka veel ei leidu või ei ole lisatud, püüab täitmise keskkond edastada sõnumi teisele objektile, kutsudes välja
forwardingTargetForSelector:ja seejärelmethodSignatureForSelector:ningforwardInvocation:.
Kui ükski neist etappidest ei too sõnumi töötlemist, toimub erind NSInvalidArgumentException.
Objective-C näide:
@implementation MyObject
- (void)myMethod {
// Meetodi realiseerimine
NSLog(@"myMethod called");
}
@end
// ...
MyObject *obj = [[MyObject alloc] init];
[obj myMethod]; // Sõnumi saatmine myMethod
Swift (varjatud) näide:
class MySwiftObject {
func mySwiftMethod() {
// Meetodi realiseerimine
print("mySwiftMethod called")
}
}
let swiftObj = MySwiftObject()
swiftObj.mySwiftMethod() // Sõnumi saatmine mySwiftMethod (dünaamilise dispetcheriga vaikimisi)
Swiftis objekti omadustele viitamine kasutab vaikimisi staatilist dispetcherit let ja var ilma @objc dynamic märgistuseta. Kui omadus on märgitud @objc dynamic, kasutab sellele viitamine samuti dünaamilist dispetcherit, sarnaselt Objective-C sõnumite saatmisega.