有人对“不透明类型”有什么好的解释吗?我在CFBundleRef
的上下文中看到了这个术语,他们在那里说:“CFBundleRef opaque type”。这是一种只读的类型吗?
答案 0 :(得分:68)
“opaque类型”是指您没有struct
或class
的完整定义的类型。在C,C ++和Objective-C中,您可以告诉编译器稍后将使用前向声明定义类型:
// 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;
编译器没有足够的信息让你直接使用struct
或class
做任何事情,除了声明它的指针,但这通常是你需要做的。这允许库和框架创建者隐藏实现细节。然后,库或框架的用户调用辅助函数来创建,操作和销毁前向声明的struct
或class
的实例。例如,框架创建者可以为struct Foo
创建这些函数:
struct Foo *createFoo(void);
void addNumberToFoo(struct Foo *foo, int number);
void destroyFoo(struct Foo *foo);
作为Core Foundation框架的一部分,Apple通过opaque类型为C程序员提供了常见的Objective-C类,如NSString
,NSArray
和NSBundle
。 C程序员使用指针和辅助函数来创建,操作和销毁这些Objective-C类的实例。 Apple将此称为“免费桥接”。它们遵循一个共同的命名约定:“CF”前缀+类名+“Ref”后缀,其中“CF”代表“Core Foundation”,“Ref”是“Reference”的缩写,意思是它指针。
答案 1 :(得分:13)
opaque类型是“包装”低级类型的类型,通常在底层实现很复杂时使用,或者用户根本不需要知道内部工作。 Apple在这里有一个很好的关于不透明类型的页面:
例如,CFString是一个opaque类型,因为它包装了一个字符数组,保持了它的长度,它的编码等,但不直接允许用户访问这些值。相反,它提供了访问或操作内部字段并向用户返回相关信息的方法。
答案 2 :(得分:2)
这是未来宣布的结构。例如:
typedef struct CFBundle *CFBundleRef;
如果没有“struct CFBundle”的实际定义,您的代码将无法访问CFBundleRef指针中的任何内容。这是不透明的。