Objective c CFSetGetCount崩溃(EXC\u错误\u访问)

Objective c CFSetGetCount崩溃(EXC\u错误\u访问),objective-c,macos,cocoa,usb,hid,Objective C,Macos,Cocoa,Usb,Hid,我正在编写一个与USB HID设备接口的Mac应用程序。首先,我试图打印出符合我的设备规格的设备数量 //Create a HID Manager IOHIDManagerRef hidManager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); //Create a dictionary and limit it to the uPPT CFMutableDictionaryRef dict = CFDic

我正在编写一个与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(Code=1,Address=0x0)”。有什么想法吗?感谢

<代码> DEVSET <代码> NUL/<代码>(在您的崩溃中以“代码> >地址=0x0”证明。)在核心基础中获得或创建<代码> CFTyPrEF/COD>时,必须始终测试<代码>空代码>代码>,因为Apple的API不执行它,并且如果通过<代码> null ,通常会崩溃。


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

EXC\u坏访问的原因是您尚未在应用程序沙盒中定义USB硬件访问权限。您可以通过激活:target settings->tab:Capabilities中的USB-硬件复选框来实现


来源:

那么你的堆栈跟踪是什么?devSet实际上是空的,所以它不再崩溃。非常感谢。不幸的是,无论我的设备是否插入,它都是空的,这意味着我一定是做错了什么,但感谢您修复了这一点。@Nick:您可能需要将供应商ID和设备ID设置为CFNumbers,而不是CFStrings。我还要把钥匙换成
kIOHIDVendorIDKey
kIOHIDProductIDKey
。哦,谢谢你。devSet不再是空的,相反它总是报告发现了7个设备,不管我是否插上了我的设备哈哈。猜测筛选工作不正常