Передача указателя CFStringRef в функцию C в MacRuby

Я хотел вызвать следующую функцию из среды DVDPlayback OS X:

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, "макрос Pointer" сообщил "Ничего не известно о Pointer", ~12 посещений Google и "MacRuby: Полное руководство")

1 ответ

Решение

Несмотря на то, что существует "бесплатный" мост от NSString к CFStringRef, это не относится к NSString* к CFStringRef* из-за использования ARC (автоматического подсчета ссылок). Приведение CFStringRef* к NSString* требует использования __bridge, поэтому

Pointer.new(:string)

не будет работать. С помощью

Pointer.new_with_type('^{__CFString}')

лучший способ получить этот указатель, а лучший способ найти эту информацию - просмотреть ошибку TypeError, которая генерируется при выборе неправильного типа. Например:

expected instance of Pointer of type `^{__CFString}', got `*' (TypeError)
Другие вопросы по тегам