2

私は次のコードを持っています:

eachShape(void *ptr, void* unused) {
  cpShape *shape = (cpShape *) ptr;
  id obj = shape->data;
  NSLog(@"shape->data: %@", obj);  // this is where EXC_BAD_ACCESS can occur
  ...

iPhone開発で使用されているChipmunk物理フレームワークからそれを認識している人もいるかもしれません。基本的に、cpSpaceに関する他のコードで何かを行っているためにここでクラッシュしますが、ここで送信されるオブジェクトタイプを把握し、NSLogステートメントをクラッシュさせます(そして他の大混乱を引き起こします)。

タイプやコンテンツをvoidポインタからNSLog呼び出しにダンプするための最良の方法は何ですか?

4

2 に答える 2

2

あなたの問題は、Objective-Cオブジェクトを実際に指している%@場合にのみ意味があると思います。これを使用すると、への送信がトリガーされるためです。ただし、たとえばを指している場合、メッセージは実際には存在しないオブジェクトに送信されます。代わりに、一部のメモリ位置がオブジェクトの生のバイトとして解釈され、ランタイムがクラッシュする可能性があります。shape->data-descriptionobjshape->dataint

あなたの質問に答えるには:voidポインタvoid *のタイプは、であり、ポインタのターゲットのタイプはですvoid。ポインタの値は。で出力できますが%p、これが目的であるとは思えません。

したがって、shape->dataポイントするメモリ位置がObjective-Cオブジェクトを表していることが確実であり、クラスコードにアクセスできる場合は、オーバーライド-descriptionして任意の情報を出力できます。

于 2010-01-12T17:53:55.260 に答える
1

フォーマット指定子は次の%@ように解釈されます

descriptionWithLocale:Objective-Cオブジェクト。使用可能な場合、またはそれ以外の場合に返される文字列として出力されdescriptionます。オブジェクトでも機能CFTypeRefし、関数の結果を返しCFCopyDescriptionます。

基本的にptr、Objective-Cオブジェクトを指していない場合は、運が悪いです。

void *いずれにせよ、あなたは何か意味のあるものへのポインタをキャストするべきです。

于 2010-01-12T17:55:17.413 に答える