これはたまにしか起こりません。押されたときにメニュー項目によって呼び出されたメソッドのブレークポイントからステップアウトすると、メソッドの最後に到達し、ステップアウトすると、最終的にccTouchEndedに到達し、アクセス不良が発生します。デバッグ出力ウィンドウには何も表示されませんが、エラーメッセージとともにメインメソッドを指す緑色の矢印が表示されます。
これが発生する可能性がある理由はありますか?
ありがとう。
これはたまにしか起こりません。押されたときにメニュー項目によって呼び出されたメソッドのブレークポイントからステップアウトすると、メソッドの最後に到達し、ステップアウトすると、最終的にccTouchEndedに到達し、アクセス不良が発生します。デバッグ出力ウィンドウには何も表示されませんが、エラーメッセージとともにメインメソッドを指す緑色の矢印が表示されます。
これが発生する可能性がある理由はありますか?
ありがとう。
誰かが同じ問題を抱えている場合に備えて、何が起こっているのかを理解しました。複数の子を含む CCMenu がありました。子がタップされたとき、私はそれで必要なことを行い、CCMenuItem のセレクターとして渡したメソッドで removeChild:cleanup: を介して CCMenu から削除しました。問題は、Cocos2d がセレクター メソッドの実行中に CCMenuItem を非アクティブ化し、メソッドが終了すると再びアクティブ化することでした。したがって、メソッドでは、基本的に CCMenuItem を CCMenu から削除して破棄し、メソッドの最後で Cocos2d が再アクティブ化を試みましたが、メモリ内にありませんでした。
これを回避する方法はあまり見当たらないので、セレクター メソッドで CCMenu から CCMenuItem を削除することはできないかもしれません。
私がそれを回避した方法は、メニュー項目で setVisible:NO と setIsEnabled:NO を呼び出すだけでした。ただし、これが最善の方法ではない場合も想像できます。このような場合、z 位置などをいじって、メニュー項目を邪魔にならないようにすることができます。
とにかく、これが他の誰かに役立つことを願っています。私はこれにしばらく行き詰まっていることを知っています. :)
私の謙虚な意見では、より良い解決策は、シーン破壊の呼び出しをスタックから巻き戻すことです。NSTimer+BlockKit のようなものを使用すると、非常にきれいになります。これが私のコードからの抜粋です:
- (void)menuAction
{
// we use a timer here to delay the execution of the action because it
// destroys the current scene and we're mid a call on CCMenu's ccTouchEnded
// that isn't expecting a scene tear down
// http://stackoverflow.com/questions/11165822/exc-bad-access-occurring-when-cocos2d-calls-cctouchended-in-ccmenu
[NSTimer scheduledTimerWithTimeInterval:0 block:^(NSTimer* timer)
{
[[CCDirector sharedDirector] popSceneWithTransition:
[CCTransitionSlideInL class] duration:kTransDur];
}
repeats:NO];
}