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í:
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.