Sobes.tech
Intern

Ի՞նչ կլինի, եթե դիմեք օբյեկտին։

sobes.tech AI

Պատասխան AI-ից

Ուղարկվում է հաղորդագրություն օբյեկտին: Եթե օբյեկտի մեջ կա համապատասխան անունով (ընտրիչով) մեթոդ, այն կիրականացվի: Եթե ոչ, տեղի կունենա գործարկման սխալ (unrecognized selector sent to instance), եթե միայն օբյեկտը չի իրականացնում հաղորդագրությունների փոխանցման մեխանիզմը:

Հաղորդագրությունների փոխանցման մեխանիզմը Objective-C/Swift-ում բաղկացած է մի քանի փուլերից՝

  1. Դինամիկ dispatcher: Օպերացիոն համակարգը որոնում է մեթոդի իրականացման (IMP) համար տվյալ ընտրիչով օբյեկտի դասում և նրա վերացական դասերում:
  2. Դինամիկ մեթոդների ավելացում: Եթե իրականացումը չի գտնվել, օպերացիոն համակարգը կանչում է +resolveInstanceMethod: (մասնակի համար) կամ +resolveClassMethod: (դասերի համար), որպեսզի հնարավորություն տա դասին դինամիկ ավելացնել մեթոդի իրականացումը:
  3. Հաղորդագրությունների փոխանցում: Եթե մեթոդը դեռ չի գտնվել կամ ավելացվել, օպերացիոն համակարգը փորձում է փոխանցել հաղորդագրությունը այլ օբյեկտի, կանչելով 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-ում հաղորդագրությունների ուղարկումը։