Protocolos Objective-C

Objective-C le permite definir protocolos, que declaran los métodos que se espera usar para una situación particular. Los protocolos se implementan en las clases que se ajustan al protocolo.

Un ejemplo simple sería una clase de manejo de URL de red, tendrá un protocolo con métodos como el método delegado processCompleted que indica la clase de llamada una vez que finaliza la operación de obtención de URL de red.

A continuación se muestra una sintaxis de protocolo.

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

Los métodos bajo palabra clave @required debe ser implementado en las clases que se ajustan al protocolo y los métodos bajo @optional la palabra clave es opcional para implementar.

Aquí está la sintaxis de la clase conforme al protocolo

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

Esto significa que cualquier instancia de MyClass responderá no solo a los métodos declarados específicamente en la interfaz, sino que MyClass también proporciona implementaciones para los métodos requeridos en MyProtocol. No es necesario volver a declarar los métodos de protocolo en la interfaz de clase: la adopción del protocolo es suficiente.

Si necesita una clase para adoptar varios protocolos, puede especificarlos como una lista separada por comas. Tenemos un objeto delegado que contiene la referencia del objeto de llamada que implementa el protocolo.

A continuación se muestra un ejemplo.

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

Ahora, cuando compilemos y ejecutemos el programa, obtendremos el siguiente 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

En el ejemplo anterior, hemos visto cómo se llaman y ejecutan los métodos delgate. Comienza con startAction, una vez que se completa el proceso, se llama al método delegado processCompleted para indicar que se completa la operación.

En cualquier aplicación de iOS o Mac, nunca tendremos un programa implementado sin un delegado. Por eso es importante que entendamos el uso de delegados. Los objetos delegados deben usar el tipo de propiedad unsafe_unretained para evitar pérdidas de memoria.