Kas notiks, ja piekļūsiet objektam?
sobes.tech AI
Atbilde no AI
Ziņojums tiek nosūtīts objektam. Ja objektā ir atbilstošs metodes ar nosaukumu (selektoru), tas tiks izpildīts. Ja nē, notiks izpildes kļūda (neatpazīts selektors, nosūtīts uz instances), ja vien objekts neīsteno ziņojumu pārsūtīšanas mehānismu:
Ziņojumu pārsūtīšanas mehānisms Objective-C/Swift sastāv no vairākiem posmiem:
- Dinamisks dispečerizācija: izpildes vide meklē metodes realizāciju (IMP) šim selektoram objekta klasē un tās vecāku klasēs.
- Dinamisks metožu pievienošana: ja realizācija nav atrasta, izpildes vide izsauc
+resolveInstanceMethod:(instancēm) vai+resolveClassMethod:(klasēm), dodot iespēju klasei dinamiski pievienot metodes realizāciju. - Ziņojumu pārsūtīšana: ja metode joprojām nav atrasta vai pievienota, izpildes vide mēģina pārsūtīt ziņojumu citam objektam, izsaucot
forwardingTargetForSelector:un pēc tammethodSignatureForSelector:unforwardInvocation:.
Ja neviens no šiem posmiem neizraisa ziņojuma apstrādi, notiek izņēmuma NSInvalidArgumentException izmešana.
Objective-C piemērs:
@implementation MyObject
- (void)myMethod {
// Metodes realizācija
NSLog(@"myMethod called");
}
@end
// ...
MyObject *obj = [[MyObject alloc] init];
[obj myMethod]; // Ziņojuma nosūtīšana myMethod
Swift (nepārprotams) piemērs:
class MySwiftObject {
func mySwiftMethod() {
// Metodes realizācija
print("mySwiftMethod called")
}
}
let swiftObj = MySwiftObject()
swiftObj.mySwiftMethod() // Ziņojuma nosūtīšana mySwiftMethod (caur dinamiski izpildes dispečerizāciju pēc noklusējuma)
Swiftā piekļūšana objekta īpašībām pēc noklusējuma izmanto statisko dispečerizāciju let un var bez @objc dynamic. Tomēr, ja īpašība ir atzīmēta ar @objc dynamic, piekļuve arī izmantos dinamiski dispečerizāciju, līdzīgi kā Objective-C ziņojumu sūtīšanā.