I’m writing a Mac application that interfaces with a USB HID device. To get started I’m trying to print out how many devices were found that match the specifications of my device.
//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);
Unfortunately this crashes at CFSetGetCount(devSet). As far as I can tell I’m using this correctly, but the application hangs and I see “Thread 1: EXC_BAD_ACCESS (Code=1, Address=0x0)”. Any ideas? Thanks
devSetisNULL(as evidenced in your crash byAddress=0x0.) You must always test forNULLwhen getting or creating aCFTypeRefin Core Foundation because Apple’s APIs don’t do it and will usually crash if passedNULL.As well, this isn’t the cause of the crash, but you must make sure to release (with
CFRelease())CFTypeRefs you create, copy, or retain, as ARC does not do it for you. And as previously stated, you must check forNULLbefore callingCFRelease()because a crash will happen otherwise.