Sobes.tech
Middle

Qu'est-ce que la dispatching?

sobes.tech IA

Réponse de l'IA

La dispatch est le processus de détermination de la méthode ou de la fonction spécifique qui sera exécutée lors de l'exécution du programme.

En Swift, il existe trois principaux types de dispatch:

  1. Statique (Dispatch statique ou direct): Le plus rapide. Le compilateur sait exactement quelle méthode sera appelée au moment de la compilation. Il n'y a pas de coûts supplémentaires pour la recherche de la méthode. S'applique à:

    • Structures (struct).
    • Enumerations (enum).
    • Méthodes dans des classes marquées comme final ou private (si pas @objc et si le dispatch dynamique via le runtime Objective-C n'est pas utilisé).
    • Fonctions globales et statiques.
    • Extensions.
  2. Tabulaire (Dispatch de table): Utilisé pour les classes. Une table virtuelle (vtable) est créée pour chaque classe, contenant des pointeurs vers les implémentations des méthodes. Lors de l'appel d'une méthode, le pointeur est recherché dans la table. Coûts supplémentaires mineurs. S'applique à:

    • Méthodes d'instance de classes (méthodes de classe), non marquées comme final ou private.
    • Propriétés calculées.
    class Animal {
        func speak() { // Dispatch de table
            print("...")
        }
    }
    
    class Dog: Animal {
        override func speak() { // Méthode redéfinie, aussi dispatch de table
            print("Woof")
        }
    }
    
  3. Dynamique (Dispatch dynamique): Le plus lent. La résolution de la méthode se produit en temps d'exécution via le runtime Objective-C. Utilisé pour interagir avec Objective-C. Coûts importants. S'applique à:

    • Méthodes marquées comme @objc dynamic.
    • Propriétés marquées comme @objc dynamic.
    • Observation de valeur clé (KVO).
    • Encodage de valeur clé (KVC).
    class SomeClass: NSObject {
        @objc dynamic func performAction() { // Dispatch dynamique
            print("Performing action")
        }
    }
    

Tableau récapitulatif:

Type Vitesse Coûts supplémentaires Où s'applique
Statique Élevée Faibles Struct, Enum, méthodes final/private en classes, extension
Tabulaire Moyenne Moyens Méthodes d'instance de classes (non final/private)
Dynamique Faible Élevés @objc dynamic

Le choix du type de dispatch est important pour optimiser la performance. Swift choisit par défaut le type le plus performant permettant de conserver la flexibilité du polymorphisme là où c'est nécessaire (en utilisant le dispatch tabulaire pour les classes). L'utilisation de final ou private peut aider le compilateur à appliquer le dispatch statique.