Sé que la directiva para un protocolo es @protocol como @selector, pero ¿cuál es el "tipo" para hacer referencia a un protocolo (por ejemplo, SEL para @Selector)? En MacOSX stack, ¿es Protocol *?Cómo referenciar el protocolo en Objective-C?
Respuesta
Hace referencia a ella como:
id<TheNameOfTheProtocol> aVariableToThatProtocol;
O si un mensaje quiere un objeto (Protocol *)
:
[myObject conformsToProtocol:@protocol(TheNameOfTheProtocol)];
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.
Es lo mismo que en OS X:
Protocol * p = objc_getProtocol("UITableViewDataSource");
Se declaró en <objc/runtime.h>
:
typedef struct objc_object Protocol;
- 1. ObjectiveC Sintaxis para especificar el nombre del protocolo en el argumento del método
- 2. Bloques ObjectiveC equivalente en Java
- 3. Referenciar variables de sesión en PHP
- 4. ¿Cómo leer el protocolo helado en Java?
- 5. Cómo escribir el protocolo monoide en Clojure?
- 6. objectivec: fb publicar comentario error
- 7. ObjectiveC Parse Integer from String
- 8. obteniendo el error "invalid_client" en la muestra gdata-objectivec-client
- 9. ¿Cómo implementar un puente sin cargo en ObjectiveC/C?
- 10. Cómo dividir la nueva línea de NSString en ObjectiveC
- 11. ¿Cómo puede incluir/referenciar un archivo en un proyecto sin copiarlo en el directorio del proyecto?
- 12. Cómo referenciar archivos XIB de un XIB principal
- 13. Referenciar restricciones de clave externa y eliminar
- 14. Vector iterator no se puede referenciar?
- 15. ¿El protocolo uwsgi es más rápido que el protocolo http?
- 16. ¿Por qué usar Url.Content para referenciar recursos?
- 17. ¿Cómo configuro el protocolo cuando uso RedirectToAction?
- 18. ¿Alguien sabe cómo implementar el protocolo NSFastEnumeration?
- 19. Cómo entender el protocolo de Kademlia (KAD)
- 20. ¿Qué es el protocolo SMPP?
- 21. Comprender el Protocolo de Bittorrent
- 22. ¿Cómo se puede extender un protocolo Clojure a otro protocolo?
- 23. Cómo utilizar arrayWithContentsOfFile al cargar el archivo escrito con éxito con WriteToFile en ObjectiveC/XCode
- 24. Entender el protocolo TLS/SSL
- 25. protocolo sin estado y protocolo con estado
- 26. Cómo usar el protocolo de control Tor en C#?
- 27. ¿Cómo se pasan las cookies en el protocolo HTTP?
- 28. Cómo definir e implementar propiedades en el protocolo
- 29. ¿Cómo se lee el búfer de protocolo GTFS en PHP?
- 30. Analizando el protocolo FIX en expresiones regulares?
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
@ 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 '. –
@ 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