cocos2d-xのメモリ管理は、リファレンスカウンタとオートリリースを利用して行われています。
cocos2d-xの一番大元のクラスにRefがありますが、このクラスがこれらのメソッドを実装しています。
以下、主な4つのメソッドとその動きの説明になります。
- autorelease
クラスを生成した後にこのメソッドを実行するとAutoreleasePoolにこのクラスが登録されます。
このプールに登録されたクラスが自動的に削除される対象になります。 - retain
リファレンスカウンタを1つ増やします。 - release
リファレンスカウンタを1つ減らします。 - getReferenceCount
リファレンスカウンタ数を取得します。
クラスの生成
Refは、クラス生成時にリファレンスカウンタを1で初期化します。
AutoreleasePoolに登録されたクラスは、毎フレームチェックされてリファレンスカウンタが1のものを削除します。
そのため、autoreleaseを実行して、そのままにしておくとすぐにそのクラスは削除されてしまいます。
そこでretainによって、リファレンスカウンタを増やしてやります。
クラスの削除
C++では通常deleteを実行しますが、Refを継承したクラスを削除する時には、releaseを実行します。
これはautoreleaseを実行してあるかどうかは関係ありません。
メモリリークの発見
xcodeなどでは、メモリリークを発見する機能がありますが、cocos2d-xのrelease忘れの場合は、検出さないため、他の方法で調べることになります。
1つの方法としては、地味で手間がかかりますが、デストラクタが実行されるかどうかをログやブレイクポイントなどで調べる方法です。