Protocolo informal en el objective-C?

Me preguntaba si alguien puede explicar qué son los protocolos informales en Objective C? Intento entenderlo en la documentación de Apple y en algunos otros libros, pero mi cabeza todavía está dando vueltas, así que realmente lo apreciaré si alguien puede explicar con el ejemplo.

Gracias.

Un protocolo informal era, como decía Jonnathan, típicamente una categoría declarada en NSObject sin la implementación correspondiente (la mayoría de las veces, existía la única que proporcionaba implementaciones ficticias en NSObject).

A partir de 10.6 (y en el SDK de iPhone), este patrón ya no se usa. Específicamente, lo que se declaró como sigue en 10.5 (y anteriores):

@interface NSObject(NSApplicationNotifications) - (void)applicationWillFinishLaunching:(NSNotification *)notification; ... @interface NSObject(NSApplicationDelegate) - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender; ... 

Ahora se declara como:

 @protocol NSApplicationDelegate  @optional - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender; ... - (void)applicationWillFinishLaunching:(NSNotification *)notification; ... 

Es decir, los protocolos informales ahora se declaran como @protocol s con un grupo de métodos @optional .

En cualquier caso, un protocolo informal es un conjunto de declaraciones de métodos mediante el cual puede implementar opcionalmente los métodos para cambiar el comportamiento. Normalmente, pero no siempre, las implementaciones del método se proporcionan en el contexto de la delegación (una fuente de datos de la vista de tabla debe implementar un puñado de métodos requeridos y, opcionalmente, puede implementar algunos métodos adicionales, por ejemplo).

Uno de los ejemplos comunes dados de protocolos informales es definir callbacks. Supongamos que está utilizando una biblioteca que le permite descargar algo en segundo plano. Esta biblioteca le permite registrar un objeto de callback para ser llamado cuando se complete.

 - (void)download:(NSURL*)url whenComplete:(id)callback 

Cuando se complete la descarga, se llamará a un método particular en su objeto de callback:

 - (void)downloadComplete:(NSURL*)url 

Por supuesto, no hay garantía de que su objeto de callback realmente implemente este método. Los protocolos informales proporcionan implementaciones triviales de estos métodos en NSObject , utilizando una categoría. Como resultado, todos los objetos en el sistema responderán al método downloadComplete: aunque no harán nada en respuesta a ese método de forma predeterminada. Las clases que anulan el método downloadComplete: pueden proporcionar una funcionalidad más útil.

Hasta ahora, puedes lograr lo mismo con un protocolo formal. Sin embargo, los protocolos informales le permiten tener métodos opcionales. Una clase que implementa un protocolo formal debe proporcionar una implementación para cada método en el protocolo. Una clase que implementa un protocolo informal puede omitir la implementación de cualquier método; ya ha heredado una implementación de NSObject .

Desde Objective-C 2.0, los protocolos formales pueden contener métodos opcionales. Además, Apple podría estar alejándose de los protocolos informales para nuevas API: UIAccelerometerDelegate es un protocolo formal.

Definimos un informal protocol al agrupar los métodos en una statement de categoría,

 @interface NSObject ( MyXMLSupport ) - initFromXMLRepresentation:(NSXMLElement *)XMLElement; - (NSXMLElement *)XMLRepresentation; @end 

Informal protocol generalmente se declaran como categorías de la clase NSObject , ya que eso asocia ampliamente los nombres de los métodos con cualquier clase que herede de NSObject .

Como todas las clases heredan de la clase raíz, los métodos no están restringidos a ninguna parte de la jerarquía de herencia. (También sería posible declarar un informal protocol como una categoría de otra clase para limitarlo a una determinada twig de la jerarquía de herencia, pero hay pocas razones para hacerlo).

Cuando se usa para declarar un protocolo, una interfaz de categoría no tiene una implementación correspondiente. En cambio, las clases que implementan el protocolo declaran los métodos nuevamente en sus propios archivos de interfaz y los definen junto con otros métodos en sus archivos de implementación.

Los protocolos informales son una forma de agregar métodos opcionales a un objeto por categoría .

Entonces una duda puede surgir

¿Se convertirá en protocolo informal si hay algún método opcional en el protocolo en sí?

La respuesta es no.

Si los métodos se declaran en protocolo y se dice que se ajustan a una clase sin ningún uso de categoría, entonces es un protocolo formal .

Nota:

Los métodos opcionales en protocolo se introdujeron en el objective c 2.0, por lo que antes el objective se lograba mediante el protocolo informal Ie por categoría.

Categoría:

Es una característica de nivel de idioma pensada para ser una alternativa para la subclase herencia aka.

Espero que arroje algo de luz sobre este …

Todo un protocolo informal es una categoría en alguna clase (a menudo NSObject ) que establece la interfaz para el protocolo. AppKit usa esto mucho para su delegación.

Una subclase que escriba puede implementar estos métodos. La diferencia entre esto y un protocolo formal es que los protocolos formales se declaran usando la notación @protocol ... @end . No se puede verificar si una clase implementa un protocolo informal dado.

Casi siempre uso protocolos formales, pero supongo que un protocolo informal es útil si desea proporcionar un comportamiento predeterminado (simplemente proporcione una implementación para su categoría que pueda ser anulada).

Según la respuesta de “Jonathan Sterling”, ¿puedo decir que el siguiente código representa un protocolo informal?

Documentación de Apple:

“Cuando se usa para declarar un protocolo, una interfaz de categoría no tiene una implementación correspondiente. En cambio, las clases que implementan el protocolo declaran los métodos nuevamente en sus propios archivos de interfaz y los definen junto con otros métodos en sus archivos de implementación”.

 #import  @interface Cat1 : NSObject { } - (void) simpleMethod; @end @implementation Cat1 - (void) simpleMethod { NSLog(@"Simple Method"); } @end @interface Cat1 (Cat2) - (void) addingMoreMethods; @end @interface MYClass : Cat1 @end @implementation MYClass - (void) addingMoreMethods { NSLog(@"Testing!"); } @end int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; MYClass *myclass = [[MYClass alloc] init]; [myclass addingMoreMethods]; [myclass release]; [pool drain]; return 0; } 

un protocolo informal define qué métodos debe comprender un objeto. Esto se llama “conforme a un protocolo”. La conformidad con un protocolo es independiente de la jerarquía de clases. Al declarar un puntero para mantener la referencia a un objeto, puede definir a qué protocolos debe ajustarse este objeto. Si escribe código que asigna un objeto que no se ajusta a todos los protocolos requeridos, recibirá una advertencia en tiempo de comstackción. Los protocolos informales lo ayudan a confiar en un conjunto de métodos que un objeto comprende. No tiene que invocar isKindOfClass: o responde a: en su código para verificar si los objetos pasados ​​serán adecuados para su procesamiento. Los protocolos son una especie de progtwigción orientada a aspectos.