2011-01-14 11 views
5

Estoy estudiando algunos conceptos básicos sobre protocolos informales y protocolos reales. Lo que me confunde es que Cocoa parece usar muchos protocolos informales en NSObject. Esos protocolos informales son categorías en NSObject que declaran métodos, pero en realidad no los implementan.¿Cuál es la diferencia entre usar un protocolo informal en NSObject o un protocolo con métodos opcionales?

En la medida en que entiendo bien, la única razón por la que hacen uso de protocolos informales (en otras palabras, categorías en NSObject que no proporcionan implementaciones de métodos), es dar una sugerencia de autocompletado en Xcode.

Un ejemplo es el método -awakeFromNib definido en NSNibLoading.h, que es un protocolo informal en NSObject. El sistema de carga de nib comprueba en tiempo de ejecución si un objeto implementa ese método. Si lo hace, entonces lo llama.

Pero ahora imaginemos que no había una función llamada protocolo informal. La alternativa que tendría exactamente el mismo efecto habría sido una declaración @protocol real que declara un método opcional -awakeFromNib. NSObject simplemente adoptaría ese protocolo y el compilador proporcionaría felizmente el autocompletado.

¿Alguien puede señalar la gran diferencia entre estas dos estrategias? No veo el sentido de los protocolos informales, pero realmente me gustaría hacerlo.

Respuesta

7

Dos enormes diferencias:

  1. Compilar tipo de tiempo de cheques. Un protocolo explícito con métodos opcionales es mucho más claro sobre qué métodos puede implementar. Tanto para adornar explícitamente la clase con el protocolo que se ajusta también, y Xcode puede proporcionar listas de finalización de código mucho más precisas de lo que podría implementar.

  2. mantiene NSObject despejada. Con los protocolos informales de estilo antiguo, todos los métodos que son opcionales generalmente tenían su implementación predeterminada agregada a NSObject.

Los protocolos informales donde una solución pura a un problema que ya no existe desde la introducción de métodos opcionales en los protocolos en Objective-C 2.0.

+0

Ya veo. Los protocolos informales provienen del pasado donde no había métodos de protocolo opcionales. Ahora esto tiene sentido. –

+0

Actualicé mi respuesta para indicar también claramente que los protocolos informales son producto de un legado. – PeyloW

1

Para utilizar un protocolo, que tendrá que importarlo, y dejar que el objeto que se está codificando en conformarse a ella

TestViewController : UIViewController <MyAwesomeProtocol> 

Para que una categoría para ser utilizado, que no tiene que haga tales cosas, puede simplemente importar la categoría (que ni siquiera es necesaria en todos los casos) y usar el objeto (en mi caso, un UIViewController) como lo haría regularmente, y XCode le proporcionaría la función de autocompletado para los métodos de categoría.

Prefiero la forma de protocolo, es más estricto y confiable. Las categorías tienden a causar problemas de construcción y son un poco extrañas (en la mayoría, no en todos los casos) para ser honesto.

+0

¿Qué tipo de problemas de construcción? –

+0

Hay casos en los que utiliza una combinación de bibliotecas, o incluso compila una biblioteca usted mismo, y las categorías tienden a desaparecer.No tengo un ejemplo claro en este momento, pero sé que el marco de trabajo de Three20 causó este tipo de problemas en nuestro proyecto debido a las categorías. No es un gran fan – Jake

3

La gran diferencia es que la palabra clave @optional se introdujo hace unos años. Para el nuevo código, los protocolos informales son básicamente obsoletos. Gran parte de los marcos no es un código nuevo.

Cuestiones relacionadas