Sobes.tech
Intern

რა მოხდება თუ ობიექტს მივმართავთ?

sobes.tech AI

პასუხი AI-სგან

მოსაღებადია შეტყობინება ობიექტისკენ. თუ ობიექტში არსებობს შესაბამისი სახელით (სელექტორით) მეთოდი, ის შესრულდება. თუ არა, მოხდება შესრულების შეცდომა (unrecognized selector sent to instance), თუ მხოლოდ ობიექტი არ ახორციელებს შეტყობინებების გადაცემის მექანიზმს:

შეტყობინებების გადაცემის მექანიზმი Objective-C/Swift-ში შედგება რამდენიმე ეტაპისგან:

  1. დინამიური დისპეჩერი: გარემო ეძებს მეთოდის რეალიზაციას (IMP) ამ სელექტორისთვის ობიექტის კლასში და მის სუპერკლასებში.
  2. დინამიური მეთოდების დამატება: თუ რეალიზაცია არ მოიძებნა, გარემო იძახის +resolveInstanceMethod: (ინსტანციებისთვის) ან +resolveClassMethod: (კლასებისთვის), რათა კლასს მისცეს შესაძლებლობა დინამიურად დაამატოს მეთოდის რეალიზაცია.
  3. შეტყობინებების გადაცემა: თუ მეთოდი ჯერ კიდევ არ მოიძებნა ან არ დაემატა, გარემო ცდილობს გადმოსცეს შეტყობინება სხვა ობიექტს, იძახის forwardingTargetForSelector: და შემდეგ methodSignatureForSelector: და forwardInvocation: მეთოდებს.

თუ ამ ეტაპებიდან არც ერთი არ გამოიწვევს შეტყობინების დამუშავებას, ხდება გამონაკლისის NSInvalidArgumentException წარმოქმნა.

Objective-C-ის მაგალითი:

@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 (დინამიური დისპეჩერის საშუალებით)

Swift-ში ობიექტის თვისებებზე მიმართვა, როგორც წესი, სტატიკური დისპეჩერით ხდება let და var-ისთვის, თუ არ არის მითითებული @objc dynamic. თუმცა, თუ თვისება აღნიშნულია @objc dynamic-ით, მიმართვა ასევე გამოიყენებს დინამიურ დისპეჩერს, როგორც Objective-C-ში შეტყობინებების გაგზავნისას.