2

我想从 OS X 的 DVDPlayback 框架中调用以下函数:

OSStatus DVDGetMediaVolumeCFName (
   CFStringRef *outDiscVolumeCFName
);

最终,我想出了以下工作代码:

framework 'DVDPlayback'
p2 = Pointer.new_with_type('^{__CFString}')
DVDGetMediaVolumeCFName(p2)

但是我在任何文档中都没有找到'^{__CFString}'它,只是后来才知道它在做什么(我最初是从错误消息中剪切并粘贴它的)。我首先用 :id 和 :string 尝试了 Pointer.new,但没有成功。

所以我的问题是:

  • 获得这个指针的最佳方式是什么(我的方式看起来很丑)?
  • 为什么没有 Pointer.new(:string) 工作?我认为 String、NSString 和 CFString 是等价的
  • 我会在哪里找到这些信息?(我查看了 MacRuby 网站,“macro Pointer”报告“Nothing known about Pointer”、~12 次谷歌点击和“MacRuby:权威指南”)
4

1 回答 1

1

尽管存在从 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)
于 2012-02-16T01:34:30.553 回答