在“CFBundleRef opaque类型”的上下文中,术语“不透明类型”是什么意思?

时间:2009-04-09 17:21:08

标签: iphone objective-c opaque-pointers

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

3 个答案:

答案 0 :(得分:68)

“opaque类型”是指您没有structclass的完整定义的类型。在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;

编译器没有足够的信息让你直接使用structclass做任何事情,除了声明它的指针,但这通常是你需要做的。这允许库和框架创建者隐藏实现细节。然后,库或框架的用户调用辅助函数来创建,操作和销毁前向声明的structclass的实例。例如,框架创建者可以为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类,如NSStringNSArrayNSBundle。 C程序员使用指针和辅助函数来创建,操作和销毁这些Objective-C类的实例。 Apple将此称为“免费桥接”。它们遵循一个共同的命名约定:“CF”前缀+类名+“Ref”后缀,其中“CF”代表“Core Foundation”,“Ref”是“Reference”的缩写,意思是它指针。

答案 1 :(得分:13)

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

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

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

答案 2 :(得分:2)

这是未来宣布的结构。例如:

typedef struct CFBundle *CFBundleRef;

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