2012-01-06 15 views

Respuesta

13

Hace referencia a ella como:

id<TheNameOfTheProtocol> aVariableToThatProtocol; 

O si un mensaje quiere un objeto (Protocol *):

[myObject conformsToProtocol:@protocol(TheNameOfTheProtocol)]; 
+0

Sólo por curiosidad, ninguna razón para que un "tipo" de protocolo debe ser utilizado con un "id ? " Procedente de un fondo de C#, es un poco más fácil visualizar una referencia de interfaz ya que solo trata su declaración de manera similar a una referencia de clase (es decir, protocolo IProtocol;). – 5StringRyan

+0

@ 5StringRyan No conozco el razonamiento, pero el tipo 'id' es el tipo general para cualquier objeto, incluso si no es un NSObject. Una ventaja de esta sintaxis es que permite múltiples protocolos. Puede hacer algo en la línea de 'id ' para expresar que el objeto cumple con ambos protocolos. O bien, si su protocolo no se ajusta a NSObject, pero una instancia de clase a la que hace referencia puede hacer lo siguiente: 'id '. –

+3

@ 5StringRyan el tipo * no * necesita ser 'id'. ejemplo: 'NSArray * var = [NSArray array];' es legal definitivamente útil a veces. también puede escribir 'NSArray * var = [NSArray array]; 'tan ... ciertamente es una buena forma de inyectar algún tipo de seguridad. (los ejemplos son tontos, solo demuestran la sintaxis) – justin

4

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

que se refiere a la nuez de oficial DOC, y se encontró un ejemplo sencillo de se refieren a otros protocolos en un protocolo:

#import "B.h" 

@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 "A.h" 

@protocol B 
    - bar:(id <A>)anObject; 
@end 

Tenga en cuenta que el uso de la directiva @protocol de esta manera simplemente informa al compilador que B es un protocolo que se definirá más adelante. No importa el archivo de interfaz donde se define el protocolo B.


Y Acá más cosas que le gustaría saber acerca de :

En muchos sentidos, los protocolos son similares a las definiciones de clase. Ambos declaran métodos, y en el tiempo de ejecución ambos están representados por objetos: clases por instancias de clase y protocolos por instancias de protocolo. Al igual que los objetos de clase, los objetos de protocolo se crean automáticamente a partir de las definiciones y declaraciones encontradas en el código fuente y son utilizadas por el sistema de tiempo de ejecución. No están asignados e inicializados en el código fuente del programa.

El código fuente puede referirse a un objeto de protocolo usando la directiva @protocol() -la misma directiva que declara un protocolo, excepto que aquí se tiene un conjunto de paréntesis finales. Los paréntesis encierran el nombre del protocolo:

Protocol *myXMLSupportProtocol = @protocol(MyXMLSupport); 

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


Y lo que es más, el es posible comprobar si un objeto es conforme a un protocolo mediante el envío de un mensaje conformsToProtocol::

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

El conformsToProtocol: Prueba es como el respondsToSelector: prueba para un único método, excepto que comprueba si se ha adoptado un protocolo (y presumiblemente todo el métodos que declara implementados) y no solo si se ha implementado un método en particular. Como comprueba todos los métodos del protocolo, conformsToProtocol: puede ser más eficiente que respondsToSelector:.

El conformsToProtocol : prueba es también como los isKindOfClass: de prueba, excepto que pone a prueba para un tipo basado en un protocolo en lugar de un tipo basado en la jerarquía de herencia.

2

Es lo mismo que en OS X:

Protocol * p = objc_getProtocol("UITableViewDataSource"); 

Se declaró en <objc/runtime.h>:

typedef struct objc_object Protocol; 
Cuestiones relacionadas