Protocoles Objective-C

Objective-C vous permet de définir des protocoles, qui déclarent les méthodes devant être utilisées pour une situation particulière. Les protocoles sont implémentés dans les classes conformes au protocole.

Un exemple simple serait une classe de gestion d'URL réseau, elle aura un protocole avec des méthodes telles que la méthode déléguée processCompleted qui indique à la classe appelante une fois l'opération de récupération d'URL réseau terminée.

Une syntaxe de protocole est présentée ci-dessous.

@protocol ProtocolName
@required
// list of required methods
@optional
// list of optional methods
@end

Les méthodes sous mot-clé @required doit être implémentée dans les classes conformes au protocole et aux méthodes sous @optional Les mots clés sont facultatifs à implémenter.

Voici la syntaxe de la classe conforme au protocole

@interface MyClass : NSObject <MyProtocol>
...
@end

Cela signifie que toute instance de MyClass répondra non seulement aux méthodes déclarées spécifiquement dans l'interface, mais que MyClass fournit également des implémentations pour les méthodes requises dans MyProtocol. Il n'est pas nécessaire de redéclarer les méthodes de protocole dans l'interface de classe - l'adoption du protocole est suffisante.

Si vous avez besoin d'une classe pour adopter plusieurs protocoles, vous pouvez les spécifier sous forme de liste séparée par des virgules. Nous avons un objet délégué qui contient la référence de l'objet appelant qui implémente le protocole.

Un exemple est présenté ci-dessous.

#import <Foundation/Foundation.h>

@protocol PrintProtocolDelegate
- (void)processCompleted;

@end

@interface PrintClass :NSObject {
   id delegate;
}

- (void) printDetails;
- (void) setDelegate:(id)newDelegate;
@end

@implementation PrintClass
- (void)printDetails {
   NSLog(@"Printing Details");
   [delegate processCompleted];
}

- (void) setDelegate:(id)newDelegate {
   delegate = newDelegate;
}

@end

@interface SampleClass:NSObject<PrintProtocolDelegate>
- (void)startAction;

@end

@implementation SampleClass
- (void)startAction {
   PrintClass *printClass = [[PrintClass alloc]init];
   [printClass setDelegate:self];
   [printClass printDetails];
}

-(void)processCompleted {
   NSLog(@"Printing Process Completed");
}

@end

int main(int argc, const char * argv[]) {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
   SampleClass *sampleClass = [[SampleClass alloc]init];
   [sampleClass startAction];
   [pool drain];
   return 0;
}

Maintenant, lorsque nous compilons et exécutons le programme, nous obtiendrons le résultat suivant.

2013-09-22 21:15:50.362 Protocols[275:303] Printing Details
2013-09-22 21:15:50.364 Protocols[275:303] Printing Process Completed

Dans l'exemple ci-dessus, nous avons vu comment les méthodes delgate sont appelées et exécutées. Il commence par startAction, une fois le processus terminé, la méthode déléguée processCompleted est appelée pour indiquer que l'opération est terminée.

Dans aucune application iOS ou Mac, nous n'aurons jamais de programme implémenté sans un délégué. Il est donc important de comprendre l'utilisation des délégués. Les objets délégués doivent utiliser le type de propriété unsafe_unretained pour éviter les fuites de mémoire.