2011-07-29 8 views
2

Objective CのUSBデバイスとやりとりするコードを記述しようとしていますが、受信レポートのコールバック関数を設定しようとしました。私の場合はIOKIT関数ですが、私は(明らかに)Objective-CでCのコールバック関数を正しく設定する方法がわからないので、問題はより一般的だと思います。すべての機能はまた、ヘッダファイルで宣言されているC Objective-C(IOKIT)のコールバック

#include <CoreFoundation/CoreFoundation.h> 
#include <Carbon/Carbon.h> 
#include <IOKit/hid/IOHIDLib.h> 
#import "USBController.h" 

static void Handle_IOHIDDeviceIOHIDReportCallback(
               void *   inContext,   // context from IOHIDDeviceRegisterInputReportCallback 
               IOReturn  inResult,   // completion result for the input report operation 
               void *   inSender,   // IOHIDDeviceRef of the device this report is from 
               IOHIDReportType inType,    // the report type 
               uint32_t  inReportID,   // the report ID 
               uint8_t *  inReport,   // pointer to the report data 
               CFIndex   InReportLength)  // the actual size of the input report 
{ 
    printf("hello"); //just to see if the function is called 
} 

@implementation USBController 
- (void)ConnectToDevice { 
    ... 
    IOHIDDeviceRegisterInputReportCallback(tIOHIDDeviceRefs[0], report, reportSize, 
      Handle_IOHIDDeviceIOHIDReportCallback,(void*)self); 
    ... 
} 
... 
@end 

:私は

USBController.m IO機能を処理するクラス「USBController」を持っています。

私はhereとほとんど同じだと思いますが、動作しません。プロジェクトがうまくコンパイルされ、入力があり、コールバック関数が呼び出されるまで、すべてがうまく動作します。次に、「EXC_BAD_ACCESS」エラーが発生します。関数の最初の3つの引数は正しいです。文脈について私はあまり確信していません。 どうしたのですか?

答えて

3

EXEC_BAD_ACCESSがコールバックによって異なるかどうかはわかりません。確かに、それが呼び出されている(私はあなたがログを見ていると言います)、メッセージだけを記録するので、これには問題はありません。

EXEC_BAD_ACCESSは、すでに割り当て解除されたオブジェクトにアクセスしようとしたために発生します。あなたは2つの方法でより多くの情報を得ることができます:

  1. プログラムをデバッグモードで実行すると、クラッシュするとスタックの内容が表示されます。

  2. NSZombiesを有効にするか、パフォーマンスツールゾンビを使用してプログラムを実行します。これは、解放後にどのオブジェクトにアクセスしたかを正確に伝えます。

+0

まあ、呼び出されません。ログメッセージはありません。これをどのようにデバッグすればよいですか?ゾンビは私に手がかりを与えません、ゾンビオブジェクトが検出されていません。スタックコンテンツではどうすればよいですか?これは次のように表示されます: #0 \t 0x7fffffe007c5 in __memcpy 存在しないオブジェクトに何かをコピーしようとしているのでしょうか?しかし、どうやって間違っているのか分かりますか? – Emiel

+0

スタックトレースが見える場合は、最後に呼び出された関数は表示されません。あなたが言うことから、私が考えることができるのは、 'レポート'はあらかじめ割り当てられていないということだけですが、それはそうだと言います。とにかく、プログラムが '__memcpy'を呼び出す方法トレース)これはあなたにヒントを与えることができます – sergio

+0

うーん、私はそれを把握することができませんでした。とにかくあなたの努力のおかげで、私はここに完全なコード[リンク](http://forums.macrumors.com/showthread.php?t=1202777)を投稿しました。 – Emiel

関連する問題