iphone objective-c opaque-pointers

iphone - ¿Qué significa el término "tipo opaco" en el contexto de "tipo opaco CFBundleRef"?



objective-c opaque-pointers (3)

Es una estructura declarada para el futuro. Por ejemplo:

typedef struct CFBundle *CFBundleRef;

Sin la definición real de "struct CFBundle", su código no puede acceder a nada dentro de un puntero de CFBundleRef. Esto es opaco.

¿Alguien tiene una buena explicación de lo que es un "tipo opaco"? Vi ese término en el contexto de CFBundleRef , donde decían: "Tipo opaco de CFBundleRef". ¿Es ese un tipo que es de solo lectura?


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

// 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 permitirte hacer nada directamente con la struct o la class excepto declarar los punteros a ella, pero esto es con frecuencia todo lo que necesitas hacer. Esto permite a los creadores de bibliotecas y marcos ocultar los detalles de la implementación. Los usuarios de una biblioteca o marco de trabajo luego invocan funciones de ayuda para crear, manipular y destruir instancias de una struct o class declarada hacia adelante. Por ejemplo, un creador de framework 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 Core Foundation, Apple hace que las clases comunes de Objective-C como NSString , NSArray y NSBundle estén disponibles para los programadores de C a través de tipos opacos. Los programadores de C usan punteros y funciones de ayuda para crear, manipular y destruir instancias de estas clases de Objective-C. Apple llama a esto "puente gratuito". Siguen una convención de denominación común: el prefijo "CF" + el nombre de la clase + el sufijo "Ref" , donde "CF" significa "Core Foundation" y "Ref" es la abreviatura de "Referencia", lo que significa que es un puntero.


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

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

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