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) |