Ի՞նչ կլինի, եթե դիմեք օբյեկտին։
sobes.tech AI
Պատասխան AI-ից
Ուղարկվում է հաղորդագրություն օբյեկտին: Եթե օբյեկտի մեջ կա համապատասխան անունով (ընտրիչով) մեթոդ, այն կիրականացվի: Եթե ոչ, տեղի կունենա գործարկման սխալ (unrecognized selector sent to instance), եթե միայն օբյեկտը չի իրականացնում հաղորդագրությունների փոխանցման մեխանիզմը:
Հաղորդագրությունների փոխանցման մեխանիզմը Objective-C/Swift-ում բաղկացած է մի քանի փուլերից՝
- Դինամիկ dispatcher: Օպերացիոն համակարգը որոնում է մեթոդի իրականացման (IMP) համար տվյալ ընտրիչով օբյեկտի դասում և նրա վերացական դասերում:
- Դինամիկ մեթոդների ավելացում: Եթե իրականացումը չի գտնվել, օպերացիոն համակարգը կանչում է
+resolveInstanceMethod:(մասնակի համար) կամ+resolveClassMethod:(դասերի համար), որպեսզի հնարավորություն տա դասին դինամիկ ավելացնել մեթոդի իրականացումը: - Հաղորդագրությունների փոխանցում: Եթե մեթոդը դեռ չի գտնվել կամ ավելացվել, օպերացիոն համակարգը փորձում է փոխանցել հաղորդագրությունը այլ օբյեկտի, կանչելով
forwardingTargetForSelector:և հետոmethodSignatureForSelector:ևforwardInvocation:մեթոդները:
Եթե այս փուլերից ոչ մեկը չի հանգեցնում հաղորդագրության մշակմանը, տեղի է ունենում արտահայտության սխալ NSInvalidArgumentException:
Օբյեկտիվ-կոդի օրինակ՝
@implementation MyObject
- (void)myMethod {
// Մեթոդի իրականացում
NSLog(@"myMethod called");
}
@end
// ...
MyObject *obj = [[MyObject alloc] init];
[obj myMethod]; // Հաղորդագրության ուղարկում myMethod
Swift (անվերապահ) օրինակ՝
class MySwiftObject {
func mySwiftMethod() {
// Մեթոդի իրականացում
print("mySwiftMethod called")
}
}
let swiftObj = MySwiftObject()
swiftObj.mySwiftMethod() // Հաղորդագրության ուղարկում mySwiftMethod (դինամիկ dispatcher-ի միջոցով ըստ նախնական)
Swift-ում օբյեկտի հատկություններին դիմելիս, ըստ նախնական, օգտագործվում է ստատիկ dispatcher՝ let և var առանց @objc dynamic նշանի: Սակայն, եթե հատկությունը նշված է որպես @objc dynamic, դիմումը նույնպես կօգտագործի դինամիկ dispatcher, ինչպես Objective-C-ում հաղորդագրությունների ուղարկումը։