Macos IOServiceGetMatchingServices()在热插拔后返回nil hid迭代器

Macos IOServiceGetMatchingServices()在热插拔后返回nil hid迭代器,macos,iokit,Macos,Iokit,我正在维护一个用于访问USB设备的库,该设备将自身注册为HID设备,并使Mac应用程序能够执行各种漂亮的功能(GPIO、I2C等)。此库可在以下位置找到: 由于我将项目升级到MacOS 10.13 SDK,当从DeviceAdded回调调用IOServiceGetMatchingServices()时,返回一个nil迭代器对象,但不返回错误代码 我的假设是,自从我在2002年左右开始编写这个库以来,IOKit中的某些内容已经发生了根本性的变化 我正在注册我的“设备插入”回调,如下所示: re

我正在维护一个用于访问USB设备的库,该设备将自身注册为HID设备,并使Mac应用程序能够执行各种漂亮的功能(GPIO、I2C等)。此库可在以下位置找到:

由于我将项目升级到MacOS 10.13 SDK,当从
DeviceAdded
回调调用IOServiceGetMatchingServices()时,返回一个nil迭代器对象,但不返回错误代码

我的假设是,自从我在2002年左右开始编写这个库以来,IOKit中的某些内容已经发生了根本性的变化

我正在注册我的“设备插入”回调,如下所示:

 result = IOServiceAddMatchingNotification(gNotifyPort,
                                          kIOFirstMatchNotification, matchingDict,
                                          IOWarriorAdded, NULL, &gIOWarriorAddedIter);

当插入受支持的设备时,确实会调用此回调,但当我随后调用IOServiceGetMatchingServices时,迭代器为nil,--或者,当其他设备已连接时,仅包含这些设备,而不包含新插入的设备

io_iterator_t IOWarriorFindHIDDevices ()
{
    CFMutableDictionaryRef hidMatchDictionary = IOWarriorSetUpHIDMatchingDictionary ();

    // Set up matching dictionary to search the I/O Registry for HID devices we are interested in. Dictionary reference is NULL if error.
    if (NULL == hidMatchDictionary) {
        PrintErrMsg ("Couldn't create a matching dictionary.");
        return 0;
    }

    io_iterator_t hidObjectIterator;

    // Now search I/O Registry for matching devices.
    IOReturn ioReturnValue = IOServiceGetMatchingServices (kIOMasterPortDefault, hidMatchDictionary, &hidObjectIterator);
    if (ioReturnValue != kIOReturnSuccess) {
        PrintErrMsgIfIOErr(ioReturnValue, "IOServiceGetMatchingServices returned error");
        return 0;
    }
    if (hidObjectIterator == 0) {
        PrintErrMsg("IOServiceGetMatchingServices returned nil hidObjectIterator");
        return 0;
    }

    return hidObjectIterator;
}

当在应用程序启动时遍历可用设备时,所有设备都会被很好地发现


你知道我做错了什么吗

我不知道这些iokitapi有什么变化。我唯一能想象的是,您的代码中有一个对象保留/释放错误,特别是在匹配字典上,例如,
ioservice getmatchingservices
使用引用。你有没有在代码上运行过叮当作响的静态分析器?如果没有找到任何东西,我会尝试运行内存诊断,例如zombie对象,看看是否找到任何东西。还要注意,
IOServiceAddMatchingNotification
返回的迭代器将为回调中的任何热插拔设备提供ioservice对象,无需每次调用
IOServiceGetMatchingServices
。如果您的
IOServiceGetMatchingServices()
IOServiceAddMatchingNotification
的匹配词典不同,我也会在那里查找问题。在最新版本的macOS中,USB和HID类已经发生了一些变化,苹果正在逐步取消向后兼容层。