【问题标题】:CFSetGetCount crash (EXC_BAD_ACCESS)CFSetGetCount 崩溃 (EXC_BAD_ACCESS)
【发布时间】:2013-01-07 09:59:19
【问题描述】:

我正在编写一个与 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)”。有任何想法吗?谢谢

【问题讨论】:

  • 那么你的堆栈跟踪是什么?

标签: objective-c macos cocoa usb hid


【解决方案1】:

devSet 是 NULL(Address=0x0 在您的崩溃中证明了这一点。)在 Core Foundation 中获取或创建 CFTypeRef 时,您必须始终测试 NULL,因为 Apple 的API 不这样做,如果通过 NULL 通常会崩溃。

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

【讨论】:

  • devSet 实际上是 NULL,因此它不再崩溃。谢谢!不幸的是,无论我的设备是否插入,它都是 NULL,这意味着我一定是做错了什么,但感谢您修复了这个问题。
  • @Nick:您可能需要将供应商 ID 和设备 ID 设置为 CFNumbers 而不是 CFStrings。我还将密钥更改为 kIOHIDVendorIDKey 和 kIOHIDProductIDKey。
  • 哦,谢谢。 devSet 不再为空,而是总是报告找到 7 个设备,无论我是否插入了我的设备,哈哈。猜测过滤不正常
【解决方案2】:

EXC_BAD_ACCESS 的原因是您尚未在应用沙盒中定义 USB 硬件访问权限。您可以通过在您的目标设置 -> 选项卡:功能中激活 USB - 硬件的复选框来实现。

来源:Apple Docs - Enabling Hardware Access

【讨论】:

    猜你喜欢
    • 2013-03-24
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多