我正在围绕最小的OpenAL功能编写自己的Objective C包装器。我试图启用的一个用例是告诉声音播放后的传输控件,如暂停/停止/恢复操作。我有兴趣尝试使用我所描述的“opaque类型”或符合Objective C lingo协议的id。在这种情况下返回其中一个是否有意义,或者直接返回一个对象并将自己绑定到该实现更容易?
假设opaque类型是正确的方法,那么协议的名称是什么?现在我正在遵循这个范例并调用协议OpenALPlaybackDelegate。我感觉好像委托并不真正适合模型,因为沟通正好相反。
答案 0 :(得分:0)
在这种情况下,opaque类型基本上只是在Apple的C API中用来代替对象的指针。与指向C中充满东西的结构的普通指针不同,“不透明类型”中的不透明性来自于头文件不公开结构定义的事实。处理它们的唯一方法是通过导出的C函数。你在两个地方看到了这个:
C API:核心图形,核心音频,核心基础,Grand Central Dispatch。 C没有任何对象。 Apple有很多像CGFoobarRef这样的类型,它们表示使用像CFFoobarMake()这样的函数做某种事情的指针;
桥接API。 C代码通过“免费电话桥”提供Cocoa功能,因此您通常可以在C世界中将Cocoa类的实例称为opaque类型。同样,这些通常以Ref结尾。例如,所有Cocoa容器类都可通过Core Foundation免费电话桥向C消费者使用。
如果您的协议的使用者是Objective-C库,我将假设它们是,因为这是使用协议的唯一方法,那么不,暴露任何访问权限都没有意义你的东西作为指向C结构的指针,这个结构充满了从客户端代码隐藏的数据和函数指针,并通过一组C函数公开。
此外,对于Apple来说,这样做的原因是封装,数据隐藏等。所有这一切都是为了让人们无法直接处理来自C land的对象的内部状态,或者编写代码这取决于它,因为C缺少像类和ivars这样的功能(好吧,Objective-C不会真的拥有私有的ivars,但它至少有秘密的)。
我认为编写一个围绕OpenAL的Objective-C包装器,正是你不想要做的就是返回不透明类型。您应该返回包含opract类型引用的Objective-C对象,其中包含调用这些引用上相关函数的访问器/ mutator。