31

有人对什么是“不透明类型”有很好的解释吗?我在 的上下文中看到了这个术语CFBundleRef,他们说:“CFBundleRef opaque type”。那是只读的类型吗?

4

3 回答 3

71

“不透明类型”是您没有完整定义的类型structor 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;

编译器没有足够的信息让您直接使用structor执行任何操作,class除非声明指向它的指针,但这通常是您需要做的所有事情。这允许库和框架创建者隐藏实现细节。库或框架的用户然后调用辅助函数来创建、操作和销毁前向声明的structclass. 例如,框架创建者可以为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.

于 2009-04-09T17:45:24.197 回答
14

opaque 类型是一种“包装”较低级别类型的类型,通常在底层实现复杂或用户根本不需要了解内部工作时使用。苹果在这里有一个关于不透明类型的好页面:

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

例如,CFString 是一个不透明类型,因为它包装了一个字符数组,维护了它的长度、它的编码等,但不允许用户直接访问这些值。相反,它提供了访问或操作内部字段并将相关信息返回给用户的方法。

于 2009-04-09T17:27:07.097 回答
2

这是一个未来声明的结构。例如:

typedef struct CFBundle *CFBundleRef;

如果没有“struct CFBundle”的实际定义,您的代码将无法访问 CFBundleRef 指针中的任何内容。这是不透明的。

于 2009-04-09T17:28:04.800 回答