こんにちは、akiです。
この記事ではカスタムイベントを削除するタイミングについて説明します。
掲題の通り、カスタムイベントを登録した場合、不要になった際に明示的に削除してやる必要があります。以下のようなケースで説明しますと・・・
画面を表示した際に、初期化処理でカスタムイベントを登録するようなシーンを2つ作ったとします。シーンA→シーンB→シーンAと画面遷移した場合、カスタムイベントAは2回登録されることになります。
Cocos2d-xでは同じカスタムイベント名でカスタムイベントを登録してしまった場合、そのカスタムイベントを発行するとプログラムが強制終了してしまいます。ですので、カスタムイベントは必ず削除してやる必要があるのです。
カスタムイベントの削除
Director::getInstance()->getEventDispatcher()->removeCustomEventListeners("custom_event_name");
“custom_event_name”は自分で定義したカスタムイベント名です。
カスタムイベントの削除のタイミング
ダメな例
いちいち画面遷移のタイミングでカスタムイベントを削除するのは面倒なので、シーンに共通するスーパークラス的な物を用意して、画面遷移時にスーパークラスのデストラクタで削除しようと試みましたが、結果はダメでした。
私の環境では、遷移元シーンのデストラクタは、遷移先シーンのコンストラクタ及び初期化処理が呼ばれた後に呼ばれていました。これでは自己画面遷移(シーンAからシーンAへの画面遷移)には対応できないので、この方法はあえなく没になりました。
結論
・カスタムイベントの削除のタイミングは必ず「画面遷移前に削除する」です。結局私の場合では、カスタムイベント削除付きの画面遷移メソッドをスーパークラスに追加することにしました。
また、この記事を書くに辺り、以下の記事を参考にさせていただきました。
以上です。