Middle
Comment le compilateur trouve-t-il la méthode à appeler?
sobes.tech IA
Réponse de l'IA
Le compilateur, lors du traitement de l'appel de méthode :
- Vérifie la présence de la définition de la méthode dans la classe et ses superclasses.
- Détermine par typage statique (au moment de la compilation) quelle méthode doit être appelée, si cela est possible.
Pendant l'exécution :
- Un mécanisme de dispatch dynamique est utilisé.
- L'objet conserve un pointeur vers sa classe.
- La classe conserve une table de dispatch (method dispatch table), ou vtable en C++/Objective-C, ou une table de méthodes (method table) en Swift.
- La table contient des pointeurs vers les implémentations des méthodes.
- Lors de l'appel d'une méthode, l'environnement d'exécution recherche l'entrée correspondante dans la table de dispatch de la classe de l'objet par le nom du sélecteur (en Objective-C) ou par la signature de la méthode (en Swift, pour les méthodes virtuelles).
- En trouvant l'entrée, le pointeur vers l'implémentation de la méthode est appelé.
En Objective-C, cela ressemble à :
// Exemple d'appel de méthode en Objective-C
// [cible messageName:parameter];
// Le runtime recherche 'messageName:' dans la table de dispatch de 'target'.class
En Swift :
// Exemple d'appel de méthode en Swift
// instance.methodName(parameter)
// Selon le type (classe finale, struct, protocole, dynamique)
// un dispatch statique ou dynamique est utilisé (vtable ou message dispatch)
Types de dispatch en Swift :
| Type | Dispatch | Optimisation |
|---|---|---|
struct, enum |
Statique | Le compilateur connaît la méthode exacte |
final class |
Statique | Le compilateur connaît la méthode exacte |
class (non final) |
Virtuel | Via la table (vtable) |
protocol (sans @objc) |
Virtuel | Via la table de témoins de protocole (protocol witness table) |
@objc (class, protocol) |
Dynamique | Via le runtime Objective-C (message dispatch) |