IOHIDEventSystemClientScheduleWithRunLoop与EXC_BAD_ACCESS

我试图在我的应用程序中获取触摸事件。 所以我使用了IOHIDFamilycallback来获取事件。 我的代码是这样的:

void handle_event(void* target, void* refcon, IOHIDServiceRef service, IOHIDEventRef event) { printf("Received event of type %2d from service %p.\n", IOHIDEventGetType(event), service); } - (void)viewDidLoad { [super viewDidLoad]; void *ioHIDEventSystem = IOHIDEventSystemClientCreate(kCFAllocatorDefault); IOHIDEventSystemClientScheduleWithRunLoop(system, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); IOHIDEventSystemClientRegisterEventCallback(system, handle_event, NULL, NULL); CFRunLoopRun(); } 

执行时出现错误:

IOHIDEventSystemClientScheduleWithRunLoop(system,CFRunLoopGetCurrent(),kCFRunLoopDefaultMode);

IOKit`IOHIDEventSystemClientScheduleWithRunLoop:

0x32f8fd14:cmp.w r10,#0
0x32f8fd18:strd r10,r11,[r4,#116] <— EXC_BAD_ACCESS(code = EXC_ARM_DA_ALIGN)
0x32f8fd1c:beq 0x32f8fdac; IOHIDEventSystemClientScheduleWithRunLoop + 168
0x32f8fd1e:ldr r1,[r4,#96]
0x32f8fd20:cbz r1,0x32f8fd2a; IOHIDEventSystemClientScheduleWithRunLoop + 38
0x32f8fd22:mov r0,r10

我是否以错误的方式使用了IOHIDFamily?

在发布的代码中至less会遇到一些问题:

首先,你在打电话

 CFRunLoopRun(); 

viewDidLoad方法中,它将在主/ UI线程上被调用。 我没有看到任何理由,所以只要删除该行。 我通常希望看到这个调用,如果你有一个方法,你在后台线程上运行,并且你需要启动一个后台运行循环。 或者,如果您是直接在main()中注册callback, 就像在这个答案中一样 。

那么,你有这个:

 void *ioHIDEventSystem = IOHIDEventSystemClientCreate(kCFAllocatorDefault); IOHIDEventSystemClientScheduleWithRunLoop(system, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); 

我猜第二行应该是

 IOHIDEventSystemClientScheduleWithRunLoop(ioHIDEventSystem, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); 

我不知道systemvariables实际上是指什么,但它看起来不正确。

看看这个最近的答案 ,因为它似乎正确使用IOKit