-->

IOHIDEventSystemClientScheduleWithRunLoop与EXC_BAD_

2019-07-23 09:31发布

我试图让我的应用程序的触摸事件。 所以我用了IOHIDFamily回调以获取事件。 我的代码是这样的:

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(系统,CFRunLoopGetCurrent(),kCFRunLoopDefaultMode);

IOKit`IOHIDEventSystemClientScheduleWithRunLoop:
...
0x32f8fd14:CMP.W R10,#0
0x32f8fd18:STRD R10,R11,[R4,#116] <--- EXC_BAD_ACCESS(代码= 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在错误的道路?

Answer 1:

有至少一对夫妇的问题,我在代码中看到贴:

首先,你在呼唤

CFRunLoopRun();

viewDidLoad的方法,这是会在主/ UI线程上被调用。 我认为没有理由为,所以只是删除了这一行。 我通常希望看到这一呼吁,如果你有,你是在后台线程运行的方法,你需要启动一个后台运行的循环。 或者,如果你在注册直接回调main() 因为在这个答案 。

然后,你有这样的:

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

我猜第二行应该是

IOHIDEventSystemClientScheduleWithRunLoop(ioHIDEventSystem, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);

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

快来看看这个最近的答案 ,因为它似乎正确使用由于IOKit。



文章来源: IOHIDEventSystemClientScheduleWithRunLoop with EXC_BAD_ACCESS