有人对"不透明类型"有什么好的解释吗?我在上下文中看到了这个术语CFBundleRef
,他们说的是:"CFBundleRef opaque type".这是一种只读的类型吗?
"opaque类型"是指您没有struct
or 的完整定义的类型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制作了常见的Objective-C类NSString
,NSArray
并且NSBundle
可以通过opaque类型供C程序员使用.C程序员使用指针和辅助函数来创建,操作和销毁这些Objective-C类的实例.Apple将此称为"免费桥接".它们遵循一个共同的命名约定:"CF"前缀+类名+"Ref"后缀,其中"CF"代表"Core Foundation","Ref"是"Reference"的缩写,意味着它是指针.
opaque类型是一种"包装"低级类型的类型,通常在底层实现很复杂时使用,或者用户根本不需要知道内部工作.Apple在这里有一个关于opaque类型的好页面:
https://developer.apple.com/library/ios/#documentation/CoreFoundation/Conceptual/CFDesignConcepts/Articles/OpaqueTypes.html
例如,CFString是一个opaque类型,因为它包装一个字符数组,保持其长度,编码等,但不直接允许用户访问这些值.相反,它提供了访问或操作内部字段并向用户返回相关信息的方法.