objective-c delegates protocols

objective c - ¿Cuál es el punto de los Protocolos?



objective-c delegates (3)

He estado escribiendo varias cosas usando protocolos según el código de ejemplo, pero también usando cosas de terceros, y parecen adoptar enfoques bastante diferentes. Algunos adoptan específicamente los protocolos en la interfaz usando

@interface myClass <myProtocol>

otros no hacen nada y simplemente se pasan a sí mismos y luego se establecen como delegados, pero el resultado final parece ser exactamente el mismo. He intentado ambos, y ambos funcionan bien. ¡Si alguien pudiera explicar esto, sería una feliz campista! Muchas gracias.


Además, el sentido del código de Xcode puede ser muy útil si utiliza protocolos. Algunas veces sugerirá los métodos faltantes.


Objective-C puede hacer tipeo tanto estático como dinámico, por lo que los protocolos no son realmente necesarios para los casos de uso habituales. Siempre puede escribir su delegado como id y luego enviarlo a cualquier mensaje que desee. (El compilador le advertirá si intenta enviar un mensaje que no es visible desde el archivo actual. Esa es la única verificación de cordura que puede hacer para los objetos de tipo id sin hacer una inferencia de tipo avanzada).

Pero restringir el tipo de id con protocolos es bueno y recomendable, porque 1) el código es más legible, 2) el compilador le advertirá si intenta enviarle algún mensaje falso al delegado y 3) obtendrá una mejor terminación del código.


Un protocolo declara un conjunto de mensajes a los que un objeto debe responder (o con @optional , puede responder). En Objective-C, su único punto (casi) * es permitir que el compilador marque las advertencias si pasa un objeto que no implementa todos los métodos del protocolo con las firmas correctas.

Tomando un ejemplo simple: NSMutalbeDictionary tiene un método -setObject: ForKey: que establece el valor para una clave en particular. La clave se declara como id tipo, lo que significa que puede pasar cualquier objeto y el compilador no se quejará. Sin embargo, la documentación del método dice:

La clave se copia (utilizando las teclas copyWithZone :; debe cumplir con el protocolo NSCopying).

entonces, si pasa un objeto que no tiene un método -copyWithZone: obtendrá una excepción en el tiempo de ejecución diciendo que la clave no responde a -copyWithZone: Hubiera sido bueno si el compilador hubiera podido detectar tu error.

Si Apple hubiera declarado el método

-(void)setObject:(id)anObject forKey:(id<NSCopying>)aKey;

el compilador habría sabido sobre el requisito de -copyWithZone: (es el único método declarado en NSCopying ) y habría captado cualquier instancia de pasar objetos incompatibles en tiempo de compilación. Creo que la razón por la que no hicieron eso es por compatibilidad con versiones anteriores. Si bbum está leyendo, él podría saber la verdadera razón por la que no.

* Digo "casi" porque puede probar para ver si un objeto cumple con un protocolo en tiempo de ejecución.