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 :
- 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.
- 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. - 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:puismethodSignatureForSelector:etforwardInvocation:.
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.