2

我正在编写一个与 USB HID 设备接口的 Mac 应用程序。首先,我试图打印出找到了多少与我的设备规格相匹配的设备。

//Create a HID Manager
IOHIDManagerRef hidManager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);

//Create a dictionary and limit it to the uPPT
CFMutableDictionaryRef dict = CFDictionaryCreateMutable (kCFAllocatorDefault, 1, &kCFTypeDictionaryKeyCallBacks,
                                                         &kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(dict, CFSTR("VendorID"), CFSTR("0x04D8"));
CFDictionarySetValue(dict, CFSTR("ProductID"), CFSTR("0x0054"));
IOHIDManagerSetDeviceMatching(hidManager, dict);

CFSetRef devSet = IOHIDManagerCopyDevices (hidManager);
CFIndex numDevices = CFSetGetCount(devSet);
NSLog(@"%ld uPPTs found", numDevices);

不幸的是,这在 CFSetGetCount(devSet) 处崩溃。据我所知,我使用正确,但应用程序挂起,我看到“线程 1:EXC_BAD_ACCESS(代码=1,地址=0x0)”。有任何想法吗?谢谢

4

2 回答 2

1

devSetNULL(正如您的崩溃所证明的那样。)在获取或创建 Core Foundation 时,Address=0x0您必须始终进行测试,因为 Apple 的 API 不会这样做,并且如果通过了通常会崩溃。NULLCFTypeRefNULL

同样,这不是导致崩溃的原因,但您必须确保释放 (with CFRelease())CFTypeRef您创建、复制或保留的 s,因为 ARC 不会为您执行此操作。如前所述,您必须NULL在调用之前进行检查,CFRelease()否则会发生崩溃。

于 2013-01-23T19:45:36.313 回答
0

EXC_BAD_ACCESS 的原因是您尚未在 App Sandbox 中定义 USB 硬件访问权限。您可以通过在您的:目标设置 -> 选项卡:功能中激活 USB - 硬件的复选框来做到这一点。

激活 USB 硬件访问(授权)

来源:Apple Docs - 启用硬件访问

于 2018-02-13T16:27:11.373 回答