Sobes.tech
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)
// Ба вобастагӣ аз навъи (синфи ниҳоӣ, сохтор, протокол, динамик)
// истифода мешавад роҳнамоии статикӣ ё динамикӣ (vtable ё message dispatch)

Намудҳои роҳнамоии Swift:

Навъ Роҳнамоӣ Оптимизатсия
struct, enum Статикӣ Компилятор медонад, ки кадом усул аст
final class Статикӣ Компилятор медонад, ки кадом усул аст
class (ки final нест) Виртуалӣ Бо истифода аз таблица (vtable)
protocol (бе @objc) Виртуалӣ Бо истифода аз таблицаи шаҳодатномаҳои протокол (protocol witness table)
@objc (class, protocol) Динамикӣ Бо истифода аз runtime Objective-C (message dispatch)