Protocolos Objective-C

Objective-C permite definir protocolos, que declaram os métodos a serem usados ​​para uma situação particular. Os protocolos são implementados nas classes em conformidade com o protocolo.

Um exemplo simples seria uma classe de manipulação de URL de rede, ela terá um protocolo com métodos como o método delegado processCompleted que intima a classe de chamada assim que a operação de busca de URL de rede terminar.

Uma sintaxe de protocolo é mostrada abaixo.

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

Os métodos em palavra-chave @required deve ser implementado nas classes que estão em conformidade com o protocolo e os métodos sob @optional palavras-chave são opcionais para implementar.

Aqui está a sintaxe da classe em conformidade com o protocolo

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

Isso significa que qualquer instância de MyClass responderá não apenas aos métodos declarados especificamente na interface, mas que MyClass também fornece implementações para os métodos necessários em MyProtocol. Não há necessidade de declarar novamente os métodos de protocolo na interface da classe - a adoção do protocolo é suficiente.

Se você precisar que uma classe adote vários protocolos, poderá especificá-los como uma lista separada por vírgulas. Temos um objeto delegado que contém a referência do objeto de chamada que implementa o protocolo.

Um exemplo é mostrado abaixo.

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

Agora, quando compilarmos e executarmos o programa, obteremos o seguinte resultado.

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

No exemplo acima, vimos como os métodos delgate são chamados e executados. Ele começa com startAction, uma vez que o processo é concluído, o método delegado processCompleted é chamado para indicar que a operação foi concluída.

Em qualquer aplicativo iOS ou Mac, nunca teremos um programa implementado sem um delegado. Portanto, é importante entendermos o uso dos delegados. Objetos delegados devem usar o tipo de propriedade unsafe_unretained para evitar vazamentos de memória.