Middle
Kompilyator qanday qilib chaqirilishi kerak bo'lgan metodni topadi?
sobes.tech AI
AIdan javob
Tahrirlovchi, usul chaqirig'ini qayta ishlayotganda:
- Sinf va uning superklasslarida usul ta'rifi mavjudligini tekshiradi.
- Statik tiplash (kompilyatsiya vaqtida) yordamida, mumkin bo'lsa, qaysi usul chaqirilishi kerakligini aniqlaydi.
Ishga tushirish vaqtida:
- Dinamik taqsimlash mexanizmi qo'llaniladi.
- Ob'ekt o'z sinfiga ko'rsatkich saqlaydi.
- Sinf taqsimlash jadvalini (method dispatch table), yoki C++/Objective-C'da vtable, yoki Swift'da method table saqlaydi.
- Jadval usullarni amalga oshirishga ko'rsatkichlarni o'z ichiga oladi.
- Usul chaqirilganda, bajarish muhit ob'ekt sinfidagi taqsimlash jadvalidagi mos yozuvni usul selektori nomi (Objective-C'da) yoki usul imzosi (Swift'da, virtual usullar uchun) bo'yicha qidiradi.
- Yozuv topilgach, usul amalga oshirishiga ko'rsatkich chaqiriladi.
Objective-C'da bu quyidagicha ko'rinadi:
// Objective-C'da usul chaqirish misoli
// [target messageName:parameter];
// Runtime 'messageName:' ni 'target'.class'dagi taqsimlash jadvalidan qidiradi
Swift'da:
// Swift'da usul chaqirish misoli
// instance.methodName(parameter)
// Turi (final class, struct, protocol, dinamik) ga qarab
// statik yoki dinamik taqsimlash (vtable yoki message dispatch) ishlatiladi.
Swift'da taqsimlash turlari:
| Turi | Taqsimlash | Optimizatsiya |
|---|---|---|
struct, enum |
Statik | Kompilyator aniq usulni biladi |
final class |
Statik | Kompilyator aniq usulni biladi |
class (final bo'lmagan) |
Virtual | Jadval orqali (vtable) |
protocol ( @objc bo'lmagan) |
Virtual | Protokol guvoh jadvali orqali |
@objc (class, protocol) |
Dinamik | Objective-C runtime orqali (message dispatch) |