Middle
Kuidas leiab kompilaator meetodi, mida kutsuda?
sobes.tech AI
Vastus AI-lt
Kompilator, metodni chaqirayotganda:
- Tekshiradi metod ta'rifini klassda va uning ota-klasslarida mavjudligini.
- Statik tiplash yordamida (kompilyatsiya vaqtida) aniqlaydi, qaysi metod chaqirilishi kerakligini, agar bu mumkin bo'lsa.
Ishga tushirish vaqtida:
- Dinamik marshrutlash mexanizmi qo'llaniladi.
- Ob'ekt o'z klassiga ko'rsatkich saqlaydi.
- Klass marshrutlash jadvalini saqlaydi (method dispatch table), yoki vtable C++/Objective-C uchun, yoki metodlar jadvalini (method table) Swift uchun.
- Jadval metodlarning realizatsiyalariga ko'rsatkichlarni o'z ichiga oladi.
- Metod chaqirilganda, bajarish muhitida ob'ektning klassi marshrutlash jadvalidan selektor nomi (Objective-C uchun) yoki metodning sigrnaturasiga (Swift, virtual metodlar uchun) mos yozuvni qidiradi.
- Topgach, metod realizatsiyasiga ko'rsatkich chaqiriladi.
Objective-C da bu shunday ko'rinadi:
// Objective-C da metod chaqirish misoli
// [target messageName:parameter];
// Runtime 'messageName:' ni 'target'.class marshrutlash jadvalidan qidiradi
Swift da:
// Swift da metod chaqirish misoli
// instance.methodName(parameter)
// Tipga qarab (final class, struct, protocol, dynamic)
// statik yoki dinamik marshrutlash (vtable yoki message dispatch) ishlatiladi.
Swift marshrutlash turlari:
| Turi | Marshrutlash | Optimizatsiya |
|---|---|---|
struct, enum |
Statik | Kompilyator aniq metodni biladi |
final class |
Statik | Kompilyator aniq metodni biladi |
class (not final) |
Virtual | Jadval orqali (vtable) |
protocol (without @objc) |
Virtual | Protokol guvoh jadvali orqali |
@objc (class, protocol) |
Dinamik | Objective-C runtime orqali (message dispatch) |