Sobes.tech
Intern

Que se passera-t-il si on accède à l'objet?

sobes.tech IA

Réponse de l'IA

Envoyer un message à un objet. Si l'objet possède une méthode avec le nom (sélecteur) correspondant, elle sera exécutée. Sinon, une erreur d'exécution se produira (sélecteur non reconnu envoyé à l'instance), sauf si l'objet implémente un mécanisme de redirection de message.

Le mécanisme de redirection de message en Objective-C/Swift se compose de plusieurs étapes :

  1. Dispatch dynamique : L'environnement d'exécution recherche l'implémentation de la méthode (IMP) pour ce sélecteur dans la classe de l'objet et ses superclasses.
  2. Ajout dynamique de méthodes : Si l'implémentation n'est pas trouvée, l'environnement d'exécution appelle la méthode +resolveInstanceMethod: (pour les instances) ou +resolveClassMethod: (pour les classes), pour donner à la classe la possibilité d'ajouter dynamiquement l'implémentation de la méthode.
  3. Redirection de message : Si la méthode n'est toujours pas trouvée ou ajoutée, l'environnement d'exécution tente de rediriger le message vers un autre objet, en appelant les méthodes forwardingTargetForSelector: puis methodSignatureForSelector: et forwardInvocation:.

Si aucune de ces étapes ne permet de traiter le message, une exception NSInvalidArgumentException est levée.

Exemple en Objective-C :

@implementation MyObject

- (void)myMethod {
    // Implémentation de la méthode
    NSLog(@"myMethod called");
}

@end

// ...
MyObject *obj = [[MyObject alloc] init];
[obj myMethod]; // Envoi du message myMethod

Exemple en Swift (implicite) :

class MySwiftObject {
    func mySwiftMethod() {
        // Implémentation de la méthode
        print("mySwiftMethod called")
    }
}

let swiftObj = MySwiftObject()
swiftObj.mySwiftMethod() // Envoi du message mySwiftMethod (via dispatch dynamique par défaut)

L'accès aux propriétés de l'objet en Swift par défaut utilise un dispatch statique pour let et var sans @objc dynamic. Cependant, si la propriété est marquée comme @objc dynamic, l'accès à celle-ci utilisera également le dispatch dynamique, similaire à l'envoi de messages en Objective-C.