こんにちは。開発担当のICTFです。
今回は久しぶりにcocos2dの話題です。
CCSpriteなどにタッチイベントを持たせたい場合、CCTouchDispatcherを用いますね。
CCTouchDispatcherは非常に便利なクラスですが、ディスパッチャからオブジェクトを削除するタイミングを違えるとメモリリークの原因ともなります。
CCTouchDispatcherへの登録は、対象となるクラスがオブジェクトとして成立してから行なう必要があります。
init()内で登録を行なっても、正常にタッチイベントを受け取る事ができません。
オブジェクトとして成立した直後にフレームワークからコールされるメソッドとしてonEnter()というものがありますので、その中でCCTouchDispatcherへの登録を行なう必要があります。
またCCTouchDispatcherからの削除もdealloc()内で行なうと正しくタッチイベントの登録を解除する事ができません。
例えばボタンのイメージを表示しているCCSpriteをCCTouchDispatcherに登録しているとします。
そのCCSpriteのdealloc()内でCCTouchDispatcherからの削除処理を記述しているとした場合、どのようになるでしょうか。
dealloc()が呼ばれるのは、CCSpriteが親ノードからremoveされるタイミングです。
一見ボタンは画面から消えたように見えますが、CCTouchDispatcherからの削除とCCSpriteの解放処理が正しく行なわれずに、透明なオブジェクトが相変わらず画面上に存在する様なイメージになります。
ボタンは見えないのにタッチイベントだけはブロックされてしまい、なぜか思うようにタッチイベントの受信ができなくなるのです。
この問題を起こさない為に、dealloc()内でCCTouchDispatcherからの削除処理を記述するのではなく、dealloc()前にフレームワークからコールされるonExit()内で記述するようにします。
特にCCTouchDispatcherからの解放ミスについては、アプリが落ちやすくなるだけでなく、タッチイベントが異常動作をするという非常に分かり辛い現象となってしまいますので注意が必要です。
コメントする