Intern
Kas nutiks, jei prieisite objektą?
sobes.tech AI
Atsakymas iš AI
Pranešimas siunčiamas objektui. Jei objekte yra atitinkamu pavadinimu (selektoriumi) metodas, jis bus vykdomas. Jei ne, įvyks vykdymo klaida (unrecognized selector sent to instance), jei tik objektas neįgyvendina pranešimų perdavimo mechanizmo:
Pranešimų perdavimo mechanizmas Objective-C/Swift susideda iš kelių etapų:
- Dinaminis dispečerizavimas: vykdymo aplinka ieško metodo įgyvendinimo (IMP) šiam selektoriui objekto klasėje ir jos tėvų klasėse.
- Dinaminis metodų pridėjimas: Jei įgyvendinimas nerandamas, vykdymo aplinka iškviečia
+resolveInstanceMethod:(instancijoms) arba+resolveClassMethod:(klasėms), kad leistų klasei dinamiškai pridėti metodo įgyvendinimą. - Pranešimų perdavimas: Jei metodas vis dar nerandamas arba nebuvo pridėtas, vykdymo aplinka bando perduoti pranešimą kitam objektui, iškviesdama
forwardingTargetForSelector:ir tadamethodSignatureForSelector:beiforwardInvocation:.
Jei nė vienas iš šių etapų neapdoroja pranešimo, įvyksta išimtis NSInvalidArgumentException.
Objective-C pavyzdys:
@implementation MyObject
- (void)myMethod {
// Metodo įgyvendinimas
NSLog(@"myMethod called");
}
@end
// ...
MyObject *obj = [[MyObject alloc] init];
[obj myMethod]; // Pranešimo siuntimas myMethod
Swift (neaiškus) pavyzdys:
class MySwiftObject {
func mySwiftMethod() {
// Metodo įgyvendinimas
print("mySwiftMethod called")
}
}
let swiftObj = MySwiftObject()
swiftObj.mySwiftMethod() // Pranešimo siuntimas mySwiftMethod (per dinaminį dispečerizavimą pagal numatytąją)
Swift'e prieiti prie objekto savybių pagal numatytąją naudota statinė dispečerizacija let ir var be @objc dynamic. Tačiau, jei savybė pažymėta kaip @objc dynamic, prieiga taip pat naudosis dinamišku dispečerizavimu, panašiai kaip Objective-C siunčiant pranešimus.