Middle
Cum găsește compilatorul metoda care trebuie apelată?
sobes.tech AI
Răspuns de la AI
Compilerul, procesând apelul metodei:
- Verifică existența definiției metodei în clasă și în superclasele sale.
- Determină prin tipizare statică (în timpul compilării), care metodă trebuie apelată, dacă este posibil.
În timpul execuției:
- Se utilizează un mecanism de dispatch dinamic.
- Obiectul păstrează un pointer către clasa sa.
- Clasa păstrează o tabelă de dispatch (method dispatch table), sau vtable în C++/Objective-C, sau o tabelă de metode (method table) în Swift.
- Tabela conține pointeri către implementările metodelor.
- La apelarea unei metode, mediul de execuție caută în tabela de dispatch a clasei obiectului, după numele selectorului (în Objective-C) sau după semnătura metodei (în Swift, pentru metode virtuale).
- După găsirea înregistrării, se apelează pointerul către implementarea metodei.
În Objective-C, acest lucru arată astfel:
// Exemplu de apel de metodă în Objective-C
// [target messageName:parameter];
// Runtime caută 'messageName:' în tabela de dispatch a 'target'.class
În Swift:
// Exemplu de apel de metodă în Swift
// instance.methodName(parameter)
// În funcție de tip (clasă finală, struct, protocol, dinamic)
// se folosește dispatch static sau dinamic (vtable sau message dispatch)
Tipuri de dispatch în Swift:
| Tip | Dispatch | Optimizare |
|---|---|---|
struct, enum |
Static | Compilatorul cunoaște metoda exactă |
final class |
Static | Compilatorul cunoaște metoda exactă |
class (nu final) |
Virtual | Prin tabelă (vtable) |
protocol (fără @objc) |
Virtual | Prin tabelă de martori de protocol |
@objc (class, protocol) |
Dinamic | Prin runtime-ul Objective-C (message dispatch) |