50 votes

Comment fonctionne un délégué en Objective-C ?

  1. Quelqu'un sait-il où je peux trouver une bonne explication/un bon tutoriel sur ce qu'est un délégué d'application et comment il fonctionne dans le cadre du système de gestion de l'information ? objective-C ?
  2. Les deux livres que j'ai ne s'attardent pas sur delegates et ne les expliquent pas très bien pour que je comprenne vraiment leur pouvoir et leur fonction.

78voto

Alex Rozanski Points 26107

En cas de doute, vérifiez le docs ¡!

Fondamentalement, la délégation est un moyen de permettre aux objets d'interagir les uns avec les autres sans créer de fortes interdépendances entre eux, car cela rend la conception de votre application moins flexible. Au lieu que les objets se contrôlent les uns les autres, ils peuvent avoir un délégué auquel ils envoient (ou délèguent) des messages, et le délégué fait tout ce qu'il fait, afin de répondre et d'agir à ce message, puis renvoie généralement quelque chose à l'autre objet.

La délégation est également une meilleure alternative à la sous-classification. Au lieu de devoir créer vos propres classes personnalisées pour modifier légèrement le comportement des autres objets ou leur transmettre des données, la délégation permet aux objets d'envoyer des messages à leurs délégués pour qu'ils effectuent le travail à leur place sans avoir à créer des sous-classes pour apporter des modifications mineures aux autres objets.

Bien entendu, le principal inconvénient de la délégation est que les méthodes de délégation disponibles dépendent de ce que les ingénieurs d'Apple considèrent comme utile et des implémentations courantes dont ils s'attendent à ce que les gens aient besoin, ce qui impose une restriction sur ce que vous pouvez réaliser. Bien que, comme Quinn Taylor l'a souligné, ceci est spécifique aux cadres Cocoa et ne s'applique donc pas à toutes les situations.

Si la délégation est une option par rapport à la sous-classification, prenez-la, car c'est une façon beaucoup plus propre de gérer votre code et les interactions entre les objets.

22voto

Steve Ives Points 181

Comme décrit ci-dessus, un délégué n'est pas une fonctionnalité d'iOS ou d'Objective-C, mais simplement une technique de programmation et ne nécessite pas de support de langage spécifique.

Une classe (par exemple, classA) peut être écrite de telle sorte que son getData y fairequelquechose peut être implémentée non pas par elle-même, mais par un délégué.

Pour ce faire, il (classA) fournit une propriété, généralement appelée délégué (qui n'est qu'un pointeur vers la classe - le délégué - qui implémente les méthodes déléguées) et ensuite, quand il veut appeler ces méthodes, il appelle réellement les méthodes du délégué :

[self.delegate getData];

y

[self.delegate doSomething];

self.delegate peut être initialement fixé à self, c'est-à-dire que classA implémente sa propre version de ces méthodes, sauf si elles sont déléguées.

Toute autre classe, voulant être l'implémenteur des méthodes (c'est-à-dire être le délégué et éventuellement surcharger l'implémentation par défaut de classA), doit d'abord définir le délégué de classA comme étant elle-même. donc dans classB, nous pourrions avoir :

classA.delegate = self;

Ainsi, lorsque classA appelle ces méthodes déléguées, elle appelle en fait classB pour implémenter ces méthodes, sans rien savoir de classB ni même qu'elle existe et que classB n'a pas à sous-classer classA.

La limitation est que la classe B peut seulement remplacer les méthodes que la classe A veut déléguer - avec la sous-classe, vous pouvez remplacer n'importe quelle méthode.

Les protocoles sont utilisés pour formaliser le processus de délégation en définissant une liste de méthodes qui soit doit être implémentée par le délégué (le délégué ne fournit pas de version par défaut de la méthode et la méthode doit être implémentée quelque part) ou peut être optionnellement implémentée par le délégué (c'est-à-dire que le délégué a sa propre version ou que cela n'a pas d'importance si la méthode n'est pas implémentée).

12voto

sourabh rajput Points 111

Les délégués sont un modèle de conception ; il n'existe pas de syntaxe spéciale ou de support de langage.

Un délégué est simplement un objet auquel un autre objet envoie des messages lorsque certaines choses se produisent, afin que le délégué puisse gérer les détails spécifiques à l'application pour lesquels l'objet original n'a pas été conçu. C'est un moyen de personnaliser le comportement sans sous-classer.

4voto

Milan Kamilya Points 413

J'essaie de l'élaborer à travers un programme simple

Deux classes

Étudiant.h

#import <Foundation/Foundation.h>

@interface Student : NSObject
@property (weak) id  delegate;
- (void) studentInfo;
@end

Étudiant.m

#import "Student.h"
@implementation Student
- (void) studentInfo
{
    NSString *teacherName;
    if ([self.delegate respondsToSelector:@selector(teacherName)]) {
        teacherName = [self.delegate performSelector:@selector(teacherName)];
    }
    NSLog(@"\n Student name is XYZ\n Teacher name is %@",teacherName);
}
@end

Enseignant.h

#import <Foundation/Foundation.h>
#import "Student.h>

@interface Teacher: NSObject
@property (strong,nonatomic) Student *student;
- (NSString *) teacherName;
- (id) initWithStudent:(Student *)student;
@end

Enseignant.m

#import "Teacher.h"

@implementation Teacher

- (NSString *) teacherName
{
    return @"ABC";
}
- (id) initWithStudent:(Student *)student
{
    self = [ super init];
    if (self) {
        self.student = student;
        self.student.delegate = self;
    }
    return self;
}
@end

main.m

#import <Foundation/Foundation.h>
#import "Teacher.h"
int main ( int argc, const char* argv[])
{
    @autoreleasepool {

        Student *student = [[Student alloc] init];
        Teacher *teacher = [[Teacher alloc] initWithStudent:student];

        [student studentInfo];

    }
    return 0;
}

EXPLICATION :: :

  1. A partir de la méthode principale, lorsque initWithStudent:student sera exécuté.

    1.1 La propriété 'student' de l'objet professeur sera assignée à l'objet étudiant.

    1.2 self.student.delegate = self signifie que le délégué de l'objet étudiant pointera vers l'objet professeur.

  2. A partir de la méthode principale quand [student studentInfo] sera appelé

    2.1 [self.delegate respondToSelector:@selector(teacherName)] Ici, le délégué pointe déjà vers l'objet 'teacher'. pointe vers l'objet professeur pour qu'il puisse invoquer la méthode de l'instance 'teacherName'.

    2.2 pour que [self.delegate performSelector:@selector(teacherName)] s'exécutera facilement.

Il semble que l'objet professeur assigne un délégué à l'objet étudiant pour appeler sa propre méthode.

Il s'agit d'une idée relative, où nous voyons que l'objet élève appelle la méthode 'teacherName', mais c'est essentiellement l'objet professeur lui-même qui s'en charge.

0voto

user3182489 Points 7

Vous appelez par téléphone et commandez une pizza
un livreur de pizza arrive chez vous (c'est un délégué) vous payez la pizza et le livreur de pizza revient avec l'argent pour le restaurant vous = objet livreur = délégué restaurant = objet

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X