2009-04-09 43 views

Respuesta

67

Un "tipo opaco" es un tipo en el que no tiene una definición completa para struct o class. En C, C++ y Objective-C, puede indicar al compilador que un tipo se definirá más adelante mediante el uso de una declaración hacia adelante:

// forward declaration of struct in C, C++ and Objective-C 
struct Foo; 

// forward declaration of class in C++: 
class Bar; 

// forward declaration of class in Objective-C: 
@class Baz; 

El compilador no tiene suficiente información para permitirle hacer nada directamente con la struct o class excepto declarar punteros a ella, pero esto es con frecuencia todo lo que necesita hacer. Esto permite a los creadores de la biblioteca y el marco ocultar los detalles de la implementación. Los usuarios de una biblioteca o marco luego llaman a las funciones auxiliares para crear, manipular y destruir instancias de un struct o class delantero declarado. Por ejemplo, un creador marco podría crear estas funciones para struct Foo:

struct Foo *createFoo(void); 
void addNumberToFoo(struct Foo *foo, int number); 
void destroyFoo(struct Foo *foo); 

Como parte del marco de la Fundación Core, Apple hace que las clases comunes de Objective-C como NSString, NSArray y NSBundle a disposición de los programadores de C a través de tipos opacos. Los programadores C usan punteros y funciones auxiliares para crear, manipular y destruir instancias de estas clases Objective-C. Apple llama a esto "puente sin cargo". Siguen una convención de nomenclatura común: prefijo "CF" + nombre de clase + "Ref" sufijo, donde "CF" significa "Fundación básica" y "Ref" es la abreviatura de "Referencia", lo que significa que es un puntero.

+0

muy impresionante ¡buena respuesta! ¡¡Gracias!! – Thanks

+0

una pregunta más sobre eso: ¿los creadores de los marcos proporcionan estas funciones auxiliares, o los crean los usuarios? – Thanks

+0

Los creadores de framework los proporcionan. –

13

Un tipo opaco es un tipo que "envuelve" tipos de nivel inferior, y se usa a menudo cuando la implementación subyacente es compleja o el usuario simplemente no necesita saber sobre el funcionamiento interno. Apple tiene una buena página en los tipos opacos aquí:

https://developer.apple.com/library/ios/#documentation/CoreFoundation/Conceptual/CFDesignConcepts/Articles/OpaqueTypes.html

Por ejemplo, CFString es un tipo opaco, ya que envuelve una matriz de caracteres, mantiene su longitud, su codificación, etc., pero no permite directamente la usuario para acceder a estos valores Más bien, proporciona métodos que acceden o manipulan campos internos y devuelven al usuario la información relevante.

2

Es una estructura futura declarada. Por ejemplo:

typedef struct CFBundle *CFBundleRef; 

Sin la propia definición de "CFBundle estructura", su código no puede acceder a cualquier cosa dentro de un puntero CFBundleRef. Esto es opaco

Cuestiones relacionadas