Sobes.tech
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)