Objective-C: Protocolos y Delegados
Desarrollando con iOS nos encontramos con una serie de paradigmas y técnicas de uso habitual que no son del todo comunes en el resto de lenguajes. Una de estas técnicas es el uso de protocolos y delegados.
Ficha técnica

Objective-C: Protocolos y Delegados
Código: 201112201635
Nivel: medio
Objetos

Objective-C es un lenguaje de programación orientado a objetos. Todos los elementos que diseñemos para llevar adelante nuestro proyecto serán objetos. Hemos de ver a un objeto como a una caja negra que es capaz de responder a mensajes que le enviamos. De este modo toda la comunicación que realicemos entre objetos deberá realizarse a través de mensajes. Es decir, que nunca deberíamos acceder a, por ejemplo, las variables de un objeto de manera directa, sino que tendremos que crear métodos de acceso (para lectura y escritura) para poder obtener o editar el valor de las variables. Sobre el tema de las propiedades, busca un artículo sobre propiedades en el índice… tarde o temprano tendré que escribirlo y aparecerá reverenciado en la barra lateral.

En esa situación, es muy fácil que nos encontremos en la necesidad de que varios objetos interactuen. Muchos programadores, sobre todo aquellos que no acaben de entender correctamente la filosofía detrás del uso de objetos (las palabras clave serían modular y reutilización) intentarán una aproximación directa sobre estos casos. Por ejemplo, recorriendo la jerarquía de datos del programa. Es decir, se que hay una aplicación, que tiene un delegado, que tiene una ventana, que tiene un conjunto de subsistas… pero eso es una solución muy estricta ya que rompe con el concepto de reutilización.

En esos casos, lo que tenemos que hacer es ir más allá de las relaciones entre objetos "padre-hijo" y buscar un protocolo de comunicación. Eso se hace mediante protocolos.

Protocolo

Un protocolo será la forma que tendrá una clase de decir "Si alguien quiere trabajar conmigo, deberá saber hacer esta serie de tareas". Es decir, un protocolo define un conjunto de mensajes que debe ser capaces de interpretar el objeto que quiere trabajar contigo. Eso lo haríamos de la siguiente forma:
@protocol MiProtocolo <NSObject>

- (id)metodoDeInstanciaQueDebeImplementarse:(id)parametro1;

@end
Y, normalmente, en un archivo .h antes de la definición de la clase a la que se refiere.

Si no especificamos nada, los métodos son obligatorios. Si queremos que los métodos sean opcionales tendremos que poner @optional antes de declarar un bloque de métodos. Con esto, estamos diciendo que cualquier clase que quiera trabajar con el objeto que define este protocolo debe ser capaz de responder al mensaje metodoDeInstanciaQueDebeImplementarse:

Delegado


Por parte de la clase que define el protocolo, lo normal es referenciar al objeto que va a cumplirlo como delegado. Es decir, un delegado es un objeto que cumple el protocolo y al que vamos a mandar los mensajes correspondientes.
id <protocolo> delegate;
Con esta nomenclatura le hemos dicho que la variable delegate será una objeto de cualquier tipo que cumpla con el protocolo MiProtocolo. Es decir, que implemente el método medotoDeInstanciaQueDebeImplementarse:

El objeto delegado, deberá incluir el archivo .h en el que se define el protocolo e implementar (que no volver a declarar) el método correspondiente.

La idea es que el objeto que realiza la acción (el que define el protocolo), en un momento dado querrá devolver un dato. Para ello, el procedimiento normal es enviar un mensaje a su delegado. Si está programado correctamente y se ha indicado que el delegado debe cumplir con el protocolo, el compilador nos avisaría si en tiempo de compilación falta por definir algún método necesario. Si no definiéramos el delegado de esa forma o si el método es opcional, lo propio sería comprobar si el objeto que es candidato a ser nuestro delegado.

Como ejemplo para ilustrar este artículo, puedes consultar el artículo referente al uso de UIAlertView que debería estar disponible próximamente (mira en la barra lateral).