2009-09-29 12 views
9
(gdb) bt 
#0 0x302ac924 in ___TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION___() 
#1 0x92077e3b in objc_exception_throw() 
#2 0x302d6ffb in -[NSObject doesNotRecognizeSelector:]() 
#3 0x3026e056 in ___forwarding___() 
#4 0x3024a0a2 in __forwarding_prep_0___() 
#5 0x00004ae9 in -[GameObject doesTouch:] (self=0xe893a0, _cmd=0x643ee, obj=0xe82e20) at /Users/aaa/Desktop/CPT/Game/Classes/GameObject.m:220 
#6 0x00006e05 in -[StaticGrid checkTouchNearest:] (self=0xe82f20, _cmd=0x64ec3, obj=0xe893a0) at /Users/aaa/Desktop/CPT/Game/Classes/StaticGrid.m:62 
#7 0x0000a393 in -[EAGLView touchesBegan:withEvent:] (self=0xe8dad0, _cmd=0x3199fa3c, touches=0x632c0b0, event=0xe14590) at /Users/aaa/Desktop/CPT/Game/Classes/EAGLView.m:459 
#8 0x30910f33 in -[UIWindow _sendTouchesForEvent:]() 
#9 0x308faecb in -[UIApplication sendEvent:]() 
#10 0x309013e1 in _UIApplicationHandleEvent() 
#11 0x32046375 in PurpleEventCallback() 
#12 0x30245560 in CFRunLoopRunSpecific() 
#13 0x30244628 in CFRunLoopRunInMode() 
#14 0x32044c31 in GSEventRunModal() 
#15 0x32044cf6 in GSEventRun() 
#16 0x309021ee in UIApplicationMain() 
... 

現在のところ、原因はまだわかりませんが、まれに発生するエラーがあります。私はどこを見るかわからないので、私が尋ねたいのは最初の5行(#0〜#4)はどういう意味ですか?私はいくつかのエラーがあると主張していますが、 "___forwarding___"のようなものは何ですか?スタックトレースの__forwarding__は何を意味しますか?

これについて何か知識がある場合は、お手伝いください。どうもありがとうございました。

答えて

20

転送ものはオム...転送メッセージに使用されます。各オブジェクトは、受信したメッセージを他のオブジェクトに簡単に転送できます(tutorial by Scott Stevensonを参照)。あなたのGameObjectがメッセージを受け取ったとき、それは理解できません、それを転送しようとします。転送が実装されていない場合、doesNotRecognizeSelectorメソッドが呼び出され、例外が発生します。

詳細な説明NSObjectクラスApple documentationに見出すことができる:

オブジェクトは、それが対応する方法を有していない のメッセージ、 に送信されると、ランタイムシステムは、受信機 にする機会を与えます別の受信者にメッセージ を委譲してください。メッセージを表すNSInvocation オブジェクトを作成し、受信者に forwardInvocation:メッセージ を含むメッセージを送信して、 メッセージを委任します。受信者の forwardInvocation:メソッドは メッセージを 別のオブジェクトに転送することを選択できます。 (...) forwardInvocationの NSObjectのの実装:単に doesNotRecognizeSelector呼び出し:メソッドを、 はメッセージを転送しません。したがって、 場合は 例外が発生しますオブジェクトに 認識されていないメッセージを送信:, forwardInvocationを実装しないことを選択します。

あなたのエラーとして、GameObjectは理解できないメッセージが送信されているようです。これはシンプルなタイプミスやメモリ管理エラーのようなより微妙なものになります。あなたにはもっと多くの情報を与える必要があります。

+4

+1良い答え。これはObjective-Cの属性であり、メソッドがコンパイル時ではなく実行時に解決される動的なプログラミング言語であることを付け加えたいと思います。存在しないメソッドを呼び出すこのコードは、実行時にアプリケーションが何をするかを解決することができ、プロキシを書くのに非常に便利です。 – PeyloW

2

まず、GameObjectに-doesTouch:か+ doesTouch:メソッドがあるかどうかを確認します。私は__forwardingが何であるかはわかりません。コンソールログにはどのようなエラーメッセージが表示されますか?

+0

スタックトレースは、「doesTouch」が認識できないメッセージではなく、urecognizedメッセージを送信していることを示していますか? – outis

+0

- [GameObject doesTouch:]が実際に認識できないメソッドを送信しています。スタックトレースから何が来たのかを知る方法はありませんが、例外がスローされたときに記録されるため、Xcodeコンソールに表示されるはずです。詳細については、objc_exception_throw(Run-> Show-> Breakpoints-> Symbolのダブルクリック、objc_exception_throw、Run-> Debug)で例外をキャッチするか、ブレークポイントを設定してください。 –

関連する問題