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) でクラッシュします。私が知る限り、これを正しく使用していますが、アプリケーションがハングし、「Thread 1: EXC_BAD_ACCESS (Code=1, Address=0x0)」が表示されます。何か案は?ありがとう

4

2 に答える 2

1

devSetNULL( によるクラッシュで証明されていますAddress=0x0。) Apple の API はそれを行わず、 が渡されると通常はクラッシュするため、Core Foundation でを取得または作成するときは常にテストする必要があります。NULLCFTypeRefNULL

同様に、これはクラッシュの原因ではありませんが、作成、コピー、または保持する s を (with でCFRelease())解放する必要がありCFTypeRefます。ARC はそれを行わないためです。前述のように、そうしないとクラッシュが発生するため、NULL呼び出す前に確認する必要があります。CFRelease()

于 2013-01-23T19:45:36.313 に答える