cocos2d-xのメモリ管理(1) | GCREST_engineerのブログ

GCREST_engineerのブログ

ブログの説明を入力します。

Refクラス
cocos2d-xのメモリ管理は、リファレンスカウンタとオートリリースを利用して行われています。
cocos2d-xの一番大元のクラスにRefがありますが、このクラスがこれらのメソッドを実装しています。
以下、主な4つのメソッドとその動きの説明になります。

  1. autorelease
    クラスを生成した後にこのメソッドを実行するとAutoreleasePoolにこのクラスが登録されます。
    このプールに登録されたクラスが自動的に削除される対象になります。

  2. retain
    リファレンスカウンタを1つ増やします。

  3. release
    リファレンスカウンタを1つ減らします。

  4. getReferenceCount
    リファレンスカウンタ数を取得します。


クラスの生成
Refは、クラス生成時にリファレンスカウンタを1で初期化します。
AutoreleasePoolに登録されたクラスは、毎フレームチェックされてリファレンスカウンタが1のものを削除します。
そのため、autoreleaseを実行して、そのままにしておくとすぐにそのクラスは削除されてしまいます。
そこでretainによって、リファレンスカウンタを増やしてやります。

クラスの削除
C++では通常deleteを実行しますが、Refを継承したクラスを削除する時には、releaseを実行します。
これはautoreleaseを実行してあるかどうかは関係ありません。

メモリリークの発見
xcodeなどでは、メモリリークを発見する機能がありますが、cocos2d-xのrelease忘れの場合は、検出さないため、他の方法で調べることになります。
1つの方法としては、地味で手間がかかりますが、デストラクタが実行されるかどうかをログやブレイクポイントなどで調べる方法です。