1

我正在围绕一组最小的 OpenAL 功能编写自己的 Objective C 包装器。我尝试启用的一个用例是在告诉声音播放(如暂停/停止/恢复操作)后进行传输控制。我有兴趣尝试使用对我描述为“不透明类型”或符合 Objective C 术语中的协议的 id 来执行此操作。在这种情况下返回其中一个是否有意义,或者直接返回一个对象并将自己绑定到该实现会更容易吗?

假设 opaque 类型是正确的方法,那么协议的好名字是什么?现在我正在遵循这个范例并调用协议 OpenALPlaybackDelegate。我觉得委托似乎不太适合模型,因为通信是相反的。

4

1 回答 1

0

在这种情况下,不透明类型基本上只是在 Apple 的 C API 中用来代替对象的指针。与指向 C 中充满东西的结构的普通指针不同,“不透明类型”中的不透明度来自于头文件不公开结构定义的事实。处理它们的唯一方法是通过导出的 C 函数。您可以在两个地方看到这一点:

  1. C API:Core Graphics、Core Audio、Core Foundation、Grand Central Dispatch。C 没有对象。Apple 有很多类型,比如 CGFoobarRef,它们表示指向某种东西的指针,这些东西是用 CFFoobarMake(); 这样的函数制作的。

  2. 桥接 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 对象,以及调用这些引用上相关函数的访问器/突变器。

于 2013-11-09T04:35:02.200 回答