Вызов функции IONotificationPortCreate вызывает ошибку компилятора

У меня проблема с функцией IONotificationCreatePort в IOKit:

var NotificationPort = IONotificationPortCreate(MasterPort)
IONotificationPortSetDispatchQueue(NotificationPort, DispatchQueue)

дает следующую ошибку компилятора, когда NotificationPort используется в вызове функции во второй строке

«Неуправляемый IONotificationPort» не идентичен «IONotificationPort».

если я использую следующий код на основе информации в документе «Использование Swift с Cocoa и Objective-C», он компилируется, но генерирует ошибку времени выполнения

var NotificationPort = IONotificationPortCreate(MasterPort).takeRetainedValue()
IONotificationPortSetDispatchQueue(NotificationPort, DispatchQueue)

Тема 1: EXC_BAD_ACCESS (код = 1, адрес = 0xнезависимо)

Итак, я думаю, что понял ошибку времени выполнения, объект IONotificationPort не имеет метода takeRetainedValue

Суть проблемы, как мне видится, в том, что функция IONotificationPortCreate создает объект IONotificationPort и возвращает ссылку на него.

Я просмотрел повсюду, и есть много информации о способах передачи ссылок в вызов функции из Swift, но я нигде не могу найти, как обращаться со ссылками в качестве возвращаемого значения.

Может ли Swift вызывать объект по ссылке?

Или я не в теме????

Вот объективный код C, который я пытаюсь преобразовать в быстрый:

    _notificationPort = IONotificationPortCreate(masterPort);
    IONotificationPortSetDispatchQueue(_notificationPort, _controllerQueue);

Вот полный фрагмент кода из моего быстрого файла:

    //Get IOKit Master Port

    var MasterPort: mach_port_t = 0
    let BootstrapPort: mach_port_t = 0
    var MasterPortReturnCode: kern_return_t = 0

    MasterPortReturnCode = IOMasterPort(BootstrapPort, &MasterPort)
    println("Master port returned as \(MasterPort) with return code of \(MasterPortReturnCode)")

    //Set up notification port and send queue

    let DispatchQueue = dispatch_queue_create("com.apparata.AVB_Browser", DISPATCH_QUEUE_SERIAL)
    var NotificationPort = IONotificationPortCreate(MasterPort)
    IONotificationPortSetDispatchQueue(NotificationPort, DispatchQueue)

person Gerry Kurz    schedule 17.12.2014    source источник
comment
Мы уверены, что порт уведомлений не nil?   -  person Logan    schedule 17.12.2014
comment
Я пытаюсь преобразовать файл Objective C в быстрый, и в коде Objective C, насколько я вижу, нет нулевой проверки. В моем быстром коде я проверяю значение MasterPort, поэтому я знаю, что оно не равно нулю. В документации для IONotificationPortCreate говорится, что возвращаемое значение: ссылка на объект уведомления.   -  person Gerry Kurz    schedule 17.12.2014
comment
Я обнаружил много странностей в подобных вещах. Пробовали ли вы регистрировать все свои значения, чтобы убедиться, что они соответствуют вашим ожиданиям?   -  person Logan    schedule 18.12.2014
comment
Хорошо, я новичок в этом. Насколько я могу судить, NotificationPort — это ссылка на объект. Как я могу зарегистрировать это и чего мне ожидать?   -  person Gerry Kurz    schedule 18.12.2014
comment
Если я запускаю строку let DispatchQueue на игровой площадке, игровая площадка зависает, а если я запускаю строку var NotificationPort на игровой площадке, я получаю ошибку времени выполнения: EXC_BAD_ACCESS(code=1,address=some address)   -  person Gerry Kurz    schedule 18.12.2014
comment
Хм, звучит странно. У меня может быть больше времени, чтобы попробовать это позже, трудно диагностировать, не копаясь в этом, потому что я не использовал эти API. Немного времени не будет.   -  person Logan    schedule 18.12.2014
comment
Я мало что знаю о Swift, но должен отметить, что в пространстве пользователя Mach-порты, включая порты уведомлений IOKit, представлены не как указатели, а как целочисленные дескрипторы. Они, безусловно, не являются объектами времени выполнения Objective-C. Попытка отправить им какое-либо сообщение Swift/Objective-C наверняка закончится плачевно.   -  person pmdj    schedule 18.12.2014