Implémenter un mécanisme de delegate
Flo
Membre
Bonjour à tous,
Je me demandais juste s'il suffisait de rajouter une ivar id *delegate dans son controller et de lui envoyer les méthodes déléguées pour implémenter un mécanisme de delegate ?
Ou alors existe-t-il des protocoles à implémenter ou une démarche spécifique à suivre ?
Je me demandais juste s'il suffisait de rajouter une ivar id *delegate dans son controller et de lui envoyer les méthodes déléguées pour implémenter un mécanisme de delegate ?
Ou alors existe-t-il des protocoles à implémenter ou une démarche spécifique à suivre ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
On implémente un protocole informel (i.e une catégorie sur NSObject)
et on prend soin de vérifier que le delegate répond à la méthode avant de lui envoyer
if([delegate respondsToSelector:@selector(machin]) { .... }
Moi depuis qu'Objective-C 2.0 est disponible, et donc depuis que les @optional ont été introduits dans les @protocols, je n'utilise que les protocoles formels (surtout depuis que je code pour iPhone qui n'utilise aussi que ça)...
Gros avantage, pas besoin d'avoir à vérifier que ton delegate répond à ta méthode avant de l'appeler, en particulier pour les méthodes @required, ce qui en fait est le cas pour la plupart des cas d'utilisation.
En plus l'utilisation des protocoles informels, et donc des catégories de NSObject (car il s'agit bien de ça en fait), a été introduite justement pour palier au manque des @optional dans les @protocol dans la première version d'Objective-C... Mais perso je suis pas fan car ça veut dire qu'on déclare les méthodes dans notre catégorie donc qu'elles sont déclarées pour toutes les sous-classe de NSObject, ça fait un peu fouilli je trouve.
Depuis que les protocoles formels permettent aussi de mettre des méthodes @optional si vraiment on a besoin, plus de raison d'utiliser les protocoles informels à mon goût.
Voilà pour l'exemple pratique. L'avantage d'utiliser les protocoles formels c'est que lorsque tu affectes la propriété "delegate" de ton Toto à un objet, il vérifie à la compilation que l'objet se conforme au protocole (a déclaré dans son .h le nom du protocole entre chevrons), et que toutes les méthodes requises sont présentes. Dans ce cas pas besoin de vérifier que le delegate "respondsToSelector" à chaque appel.
Tu as peut être raison, la doc Obj 2.0 autorise les deux formes de protocole.
On gagne quoi au protocole formel ? un test en moins à l'exécution ... les warnings à la compilation pour nous rappeler à l'ordre ...
Va pour le protocol formel, c'est vrai que ça cumule tous les avantages.
Mais de toute façon je trouve ça aussi plus propre... et pour tout avouer... ça m'arrange aussi d'utiliser les @protocols formels puisqu'ensuite je peux utiliser mon script qui me génère les TextMacros automatiquement et me permet de générer le code associé directement :P
Après, c'est un peu comme les @property : tu peux toujours ne pas les utiliser, mais depuis que la fonctionnalité existe, comme ça facilite la vie et surtout la lecture du code, ce serait bête de pas passer par là et de continuer avec la bonne vieille méthode
Et pour l'anecdote, le protocol informel permet aussi d'utiliser une classe comme delegate, car les méthodes déclarées dans la classe racine (NSObject en l'occurrence) peuvent être appelées comme méthode de classe par ses sous-classes.
Ainsi pour moi rajouter une classe "reverseString" à la classe NSString (pour retourner la chaà®ne dans le sens inverse par exemple, en imaginant que ça vous est utile), ou les fameuses catégories de NSString permettant de gérer le Base64... et les catégories sur NSObject, servant juste à coutourner le problème des warnings à l'époque où les @optional n'existait pas et donc les @protocol n'était pas utilisables pour des delegate pour lesquels on ne voulait pas imposer de tout implémenter... y'a quand même une sacrée différence de use case.
Donc pour moi, les @protocols sont fait pour ça à la base (et la notion de contrat d'interface dans la POO en général), donc je ne vois pas pourquoi utiliser autre chose... Les catégories de NSObjects pour les protocols informels) c'est purement historique genre paliatif avant Objective-C 2.0...
Il y a tout de même une grosse différence entre un protocol formel et informel... Dans le cas du protocol formel, celui-ci existe à l'exécution, il est enregistré dans le runtime avec toutes ses méthodes...
Alors que dans le cas du protocol informel, qui n'est pas implémenté, à l'exécution il n'existe plus, seuls les sélecteurs sont gardés et les autres informations, comme les types ont tout juste étaient utilisés par le compilateur.