Protocolli Objective-C

Objective-C consente di definire protocolli che dichiarano i metodi che ci si aspetta vengano utilizzati per una situazione particolare. I protocolli sono implementati nelle classi conformi al protocollo.

Un semplice esempio potrebbe essere una classe di gestione dell'URL di rete, che avrà un protocollo con metodi come il metodo delegato processCompleted che intimidisce la classe chiamante una volta terminata l'operazione di recupero dell'URL di rete.

Di seguito viene mostrata una sintassi del protocollo.

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

I metodi sotto parola chiave @required deve essere implementato nelle classi conformi al protocollo e ai metodi sotto @optional le parole chiave sono facoltative da implementare.

Ecco la sintassi per la classe conforme al protocollo

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

Ciò significa che qualsiasi istanza di MyClass risponderà non solo ai metodi dichiarati specificamente nell'interfaccia, ma che MyClass fornisce anche implementazioni per i metodi richiesti in MyProtocol. Non è necessario dichiarare nuovamente i metodi del protocollo nell'interfaccia della classe: l'adozione del protocollo è sufficiente.

Se hai bisogno di una classe per adottare più protocolli, puoi specificarli come un elenco separato da virgole. Abbiamo un oggetto delegato che contiene il riferimento dell'oggetto chiamante che implementa il protocollo.

Di seguito è mostrato un esempio.

#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;
}

Ora, quando compiliamo ed eseguiamo il programma, otterremo il seguente risultato.

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

Nell'esempio sopra abbiamo visto come vengono chiamati ed eseguiti i metodi delgate. Inizia con startAction, una volta completato il processo, viene chiamato il metodo delegato processCompleted per intimare il completamento dell'operazione.

In qualsiasi app iOS o Mac, non avremo mai un programma implementato senza un delegato. Quindi è importante che comprendiamo l'uso dei delegati. Gli oggetti delegati devono utilizzare il tipo di proprietà unsafe_unretained per evitare perdite di memoria.