Middle
Come trova il compilatore il metodo da chiamare?
sobes.tech AI
Risposta dell'AI
Il compilatore, elaborando la chiamata al metodo:
- Verifica la presenza della definizione del metodo nella classe e nelle sue superclasse.
- Determina tramite tipizzazione statica (durante la compilazione) quale metodo deve essere chiamato, se possibile.
Durante l'esecuzione:
- Viene utilizzato un meccanismo di dispatch dinamico.
- L'oggetto mantiene un puntatore alla sua classe.
- La classe mantiene una tabella di dispatch (method dispatch table), o vtable in C++/Objective-C, o una tabella di metodi (method table) in Swift.
- La tabella contiene puntatori alle implementazioni dei metodi.
- Quando si chiama un metodo, l'ambiente di esecuzione cerca la corrispondente voce nella tabella di dispatch della classe dell'oggetto per nome del selettore (in Objective-C) o per firma del metodo (in Swift, per metodi virtuali).
- Una volta trovata la voce, viene chiamato il puntatore all'implementazione del metodo.
In Objective-C, questo appare così:
// Esempio di chiamata di metodo in Objective-C
// [target messageName:parameter];
// Il runtime cerca 'messageName:' nella tabella di dispatch di 'target'.class
In Swift:
// Esempio di chiamata di metodo in Swift
// instance.methodName(parameter)
// A seconda del tipo (classe final, struct, protocollo, dinamico)
// si utilizza dispatch statico o dinamico (vtable o message dispatch)
Tipi di dispatch in Swift:
| Tipo | Dispatch | Ottimizzazione |
|---|---|---|
struct, enum |
Statico | Il compilatore conosce il metodo esatto |
final class |
Statico | Il compilatore conosce il metodo esatto |
class (non final) |
Virtuale | Tramite tabella (vtable) |
protocol (senza @objc) |
Virtuale | Tramite tabella di testimoni di protocollo (protocol witness table) |
@objc (class, protocol) |
Dinamico | Tramite il runtime Objective-C (message dispatch) |