将CFStringRef指针传递给MacRuby中的C函数

时间:2011-11-16 04:13:32

标签: cocoa macruby cfstring

我想从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网站,“宏指针”报道“没有关于指针的消息”,~12个谷歌点击,以及“MacRuby:权威指南”)

1 个答案:

答案 0 :(得分: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)