¿Cómo hacer reference al protocolo en Objective-C?

Sé que la directiva para un protocolo es @protocol al igual que @selector, pero ¿cuál es el "tipo" para hacer reference a un protocolo (por ejemplo, SEL para @Selector)? En la stack MacOSX, es el protocolo *?

Lo reference como:

id<TheNameOfTheProtocol> aVariableToThatProtocol; 

O si un post quiere un object (Protocol *) :

 [myObject conformsToProtocol:@protocol(TheNameOfTheProtocol)]; 

id <YourProtocol> delegate (que se utiliza para hacer reference al protocolo)?

Me referí al DOC oficial de la manzana, y encontré un ejemplo simple para referirme a otros protocolos en un protocolo:

 #import "Bh" @protocol B; // To break the recursive cycle, you must use the @protocol directive to make a forward reference to the needed protocol instead of importing the interface file where the protocol is defined @protocol A - foo:(id <B>)anObject; @end 

donde el protocolo B se declara así:

 #import "Ah" @protocol B - bar:(id <A>)anObject; @end 

Tenga en count que el uso de la directiva @protocol de esta manera simplemente informa al comstackdor que B es un protocolo que se definirá más adelante. No importa el file de interfaz donde está definido el protocolo B.


Y aquí hay más cosas que le gustaría saber sobre el protocol :

En muchos sentidos, los protocolos son similares a las definiciones de class. Ambos declaran methods, y en time de ejecución ambos están representados por classs de objects por instancias de Clase y protocolos por instancias de Protocolo. Al igual que los objects de class, los objects de protocolo se crean automáticamente a partir de las definiciones y declaraciones que se encuentran en el código fuente y son utilizadas por el sistema de time de ejecución. No están asignados e inicializados en el código fuente del progtwig.

El código fuente puede referirse a un object de protocolo utilizando la directiva @protocol () , la misma directiva que declara un protocolo, excepto que aquí tiene un set de paréntesis posteriores. Los paréntesis incluyen el nombre del protocolo:

  Protocol *myXMLSupportProtocol = @protocol(MyXMLSupport); 

Esta es la única forma en que el código fuente puede evocar un object de protocolo. A diferencia de un nombre de class, un nombre de protocolo no designa el object, excepto dentro de @protocol ().


Y lo que es más, el protocol es posible comprobar si un object se ajusta a un protocolo enviándole un post conformsToProtocol: :

 if ( ! [receiver conformsToProtocol:@protocol(MyXMLSupport)] ) { // Object does not conform to MyXMLSupport protocol // If you are expecting receiver to implement methods declanetworking in the // MyXMLSupport protocol, this is probably an error } 

The conformsToProtocol: test es como el responddsToSelector: testing para un solo método, excepto que comtesting si se ha adoptado un protocolo (y presumiblemente todos los methods que declara implementados) en lugar de solo si un método particular se ha implementado. Porque comtesting todos los methods en el protocolo, conformaToProtocol: puede ser más eficiente que responderToSelector:.

La testing conformesToProtocol: es similar a la testing isKindOfClass: excepto que testing un tipo basado en un protocolo en lugar de un tipo basado en la jerarquía de inheritance.

Es lo mismo que en OS X:

 Protocol * p = objc_getProtocol("UITableViewDataSource"); 

Está declarado en <objc/runtime.h> :

 typedef struct objc_object Protocol;