Sobes.tech
Middle

როგორ პოულობს კომპილატორი მეთოდს, რომელსაც უნდა გამოიძახოს?

sobes.tech AI

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

კომპილატორი, მეთოდის გამოძახებისას:

  • შემოწმებს მეთოდის განსაზღვრას კლასში და მის სუპერკლასებში.
  • განსაზღვრავს სტატიკური ტიპიზაციის დახმარებით (კომპილაციის დროს), რომელი მეთოდი უნდა იყოს გამოძახებული, თუ ეს შესაძლებელია.

შესრულების დროს:

  • გამოიყენება დინამიური დისპეჩერის მექანიზმი.
  • ობიექტი ინახავს მითითებას თავის კლასზე.
  • კლასი ინახავს დისპეჩერის ცხრილს (method dispatch table), ან vtable C++/Objective-C-ში, ან მეთოდის ცხრილს (method table) Swift-ში.
  • ცხრილი შეიცავს მეთოდების რეალიზაციების მითითებებს.
  • მეთოდის გამოძახებისას, შესრულების გარემო ეძებს შესაბამის ჩანაწერს ობიექტის კლასის დისპეჩერის ცხრილში სელექტორის სახელით (Objective-C-ში) ან მეთოდის სიგნატურით (Swift-ში, ვირტუალურ მეთოდებზე).
  • მოძებნის შემდეგ, იძახება მეთოდის რეალიზაციის მითითება.

Objective-C-ში ეს ასე გამოიყურება:

// მაგალითი მეთოდის გამოძახების Objective-C-ში
// [target messageName:parameter];
// Runtime ეძებს 'messageName:'-ს დისპეჩერის ცხრილში 'target'.class

Swift-ში:

// მაგალითი მეთოდის გამოძახების Swift-ში
// instance.methodName(parameter)
// ტიპის მიხედვით (final class, struct, protocol, dynamic)
// გამოიყენება სტატიკური ან დინამიური დისპეჩერაცია (vtable ან message dispatch)

Swift-ის დისპეჩერის ტიპები:

ტიპი დისპეჩერაცია ოპტიმიზაცია
struct, enum სტატიკური კომპილატორი იცის ზუსტი მეთოდი
final class სტატიკური კომპილატორი იცის ზუსტი მეთოდი
class (არ final) ვირტუალური ვებსაიტით (vtable) მეშვეობით
protocol (@objc გარეშე) ვირტუალური პროტოკოლის მოწმე ცხრილით (protocol witness table)
@objc (class, protocol) დინამიური Objective-C runtime-ის მეშვეობით (message dispatch)