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