我想从 OS X 的 DVDPlayback 框架调用以下函数:
OSStatus DVDGetMediaVolumeCFName (
CFStringRef *outDiscVolumeCFName
);
最终,我想出了以下工作代码:
framework 'DVDPlayback'
p2 = Pointer.new_with_type('^{__CFString}')
DVDGetMediaVolumeCFName(p2)
但我在任何文档中都没有找到 '^{__CFString}'
位,后来才发现它真正在做什么(我最初是从错误消息中剪切并粘贴它的)。我首先尝试使用 Pointer.new 和 :id 和 :string 但没有成功。
所以我的问题是:
- 获取此指针的最佳方法是什么(我的方法看起来很难看)?
- 为什么 Pointer.new(:string) 不起作用?我认为 String、NSString 和 CFString 是等效的
- 我应该在哪里找到这些信息? (我检查了 MacRuby 网站,“macro Pointer”报告“对 Pointer 一无所知”,约 12 次 Google 搜索,以及“MacRuby:权威指南”)
最佳答案
尽管存在从 NSString 到 CFStringRef 的“免费”桥梁,但由于使用了 ARC(自动引用计数),因此这不适用于 NSString* 到 CFStringRef*。将 CFStringRef* 转换为 NSString* 需要使用 __bridge,因此
Pointer.new(:string)
不会工作。使用
Pointer.new_with_type('^{__CFString}')
是获取此指针的最佳方法,而查找此信息的最佳方法是查看选择错误类型时生成的 TypeError。例如:
expected instance of Pointer of type `^{__CFString}', got `*' (TypeError)
关于cocoa - 将 CFStringRef 指针传递给 MacRuby 中的 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8146629/