2013-03-26 71 views
1

我試圖在我的應用程序中獲取觸摸事件。所以我使用IOHIDFamily回調來獲取事件。我的代碼是這樣的:IOHIDEventSystemClientScheduleWithRunLoop with EXC_BAD_ACCESS

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在錯誤的道路?

回答

1

有至少一對夫婦的問題,我在代碼中看到貼:

首先,你在viewDidLoad方法調用

CFRunLoopRun(); 

,這是怎麼回事主/ UI線程上被稱爲。我認爲沒有理由,所以只要刪除該行。如果你有一個你在後臺線程上運行的方法,並且你需要啓動一個後臺運行循環,我通常會期望看到這個調用。或者,如果您直接在main()as in this answer註冊回調。

然後,你有這樣的:

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

我猜第二行應該是

IOHIDEventSystemClientScheduleWithRunLoop(ioHIDEventSystem, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); 

我不知道是什麼system變量實際上是指,但它不」你看起來不錯。

look at this recent answer,因爲它似乎正確使用IOKit