有人对什么是“不透明类型”有很好的解释吗?我在 的上下文中看到了这个术语CFBundleRef
,他们说:“CFBundleRef opaque type”。那是只读的类型吗?
3 回答
“不透明类型”是您没有完整定义的类型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
or执行任何操作,class
除非声明指向它的指针,但这通常是您需要做的所有事情。这允许库和框架创建者隐藏实现细节。库或框架的用户然后调用辅助函数来创建、操作和销毁前向声明的struct
或class
. 例如,框架创建者可以为struct Foo
:
struct Foo *createFoo(void);
void addNumberToFoo(struct Foo *foo, int number);
void destroyFoo(struct Foo *foo);
As part of the Core Foundation framework, Apple makes common Objective-C classes like NSString
, NSArray
and NSBundle
available to C programmers through opaque types. C programmers use pointers and helper functions to create, manipulate and destroy instances of these Objective-C classes. Apple calls this "toll-free bridging". They follow a common naming convention: "CF" prefix + class name + "Ref" suffix, where "CF" stands for "Core Foundation" and "Ref" is short for "Reference", meaning it's a pointer.
opaque 类型是一种“包装”较低级别类型的类型,通常在底层实现复杂或用户根本不需要了解内部工作时使用。苹果在这里有一个关于不透明类型的好页面:
例如,CFString 是一个不透明类型,因为它包装了一个字符数组,维护了它的长度、它的编码等,但不允许用户直接访问这些值。相反,它提供了访问或操作内部字段并将相关信息返回给用户的方法。
这是一个未来声明的结构。例如:
typedef struct CFBundle *CFBundleRef;
如果没有“struct CFBundle”的实际定义,您的代码将无法访问 CFBundleRef 指针中的任何内容。这是不透明的。