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