Сбой CFSetGetCount (EXC_BAD_ACCESS)
Я пишу приложение для Mac, которое взаимодействует с устройством USB HID. Для начала я пытаюсь распечатать, сколько устройств было найдено, которые соответствуют спецификациям моего устройства.
//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)". Есть идеи? Спасибо
2 ответа
devSet
является NULL
(как видно из вашей аварии Address=0x0
.) Вы должны всегда проверять на NULL
при получении или создании CFTypeRef
в Core Foundation, потому что API-интерфейсы Apple этого не делают и, как правило, выдают сбой NULL
,
Кроме того, это не является причиной сбоя, но вы должны обязательно выпустить (с CFRelease()
) CFTypeRef
s вы создаете, копируете или сохраняете, поскольку ARC не сделает этого за вас. И как уже говорилось ранее, вы должны проверить NULL
перед звонком CFRelease()
потому что иначе произойдет сбой.
Причиной EXC_BAD_ACCESS является то, что вы не определили право доступа к аппаратному USB -устройству в своей изолированной программной среде приложения. Вы можете сделать это, установив флажок для USB - Оборудование в вашей: целевые параметры -> вкладка: Возможности.