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);
我不知道system
variables实际上是指什么,但它看起来不正确。
看看这个最近的答案 ,因为它似乎正确使用IOKit 。