在这种情况下,不透明类型基本上只是在 Apple 的 C API 中用来代替对象的指针。与指向 C 中充满东西的结构的普通指针不同,“不透明类型”中的不透明度来自于头文件不公开结构定义的事实。处理它们的唯一方法是通过导出的 C 函数。您可以在两个地方看到这一点:
C API:Core Graphics、Core Audio、Core Foundation、Grand Central Dispatch。C 没有对象。Apple 有很多类型,比如 CGFoobarRef,它们表示指向某种东西的指针,这些东西是用 CFFoobarMake(); 这样的函数制作的。
桥接 API。Cocoa 功能通过“免费桥”提供给 C 代码,因此您通常可以将 C 世界中 Cocoa 类的实例作为不透明类型来处理。同样,这些通常以 Ref 结尾。例如,所有 Cocoa 容器类都可以通过 Core Foundation 免费桥接器提供给 C 消费者。
相关苹果文档
如果您的协议的使用者是 Objective-C 库,我将假设他们是,因为这是使用协议的唯一方法,那么不,公开对您的任何东西的访问是没有意义的指向 C 结构的指针,其中填充了数据和函数指针,这些指针对客户端代码隐藏并通过一组 C 函数公开。
此外,对于 Apple 而言,这样做的原因是封装、数据隐藏等。它所做的只是让人们无法直接处理 C 语言中对象的内部状态,或者编写依赖于它,因为 C 缺少类和 ivars 之类的功能(好吧,Objective-C 也没有真正的私有 ivars,但它至少有秘密的)。
我认为围绕 OpenAL 编写一个 Objective-C 包装器,正是你不想做的就是返回不透明类型。您应该返回包含不透明类型引用的 Objective-C 对象,以及调用这些引用上相关函数的访问器/突变器。