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) |