cococococos 2 d-xメモリ管理01:概要
この文章は古いGから出たものだ のBLOG《cocococococos 2 d-x学習ノート18:メモリ管理01:概要》、住所http://4137613.blog.51cto.com/4127613/784134
一、概要
cocococos 2 d-xは最初にcococos 2 dのobjective Cバージョンから移植されます.したがって、メモリ管理にはNSObjectと同様の参照カウンタ方法が用いられ、関連インターフェースはCCObjectクラスに配置される.
二、参照カウンタ——手動でメモリを管理する
CCObjectのおよびそのサブクラスのオブジェクトは、作成時に参照カウントが自動的に1に設定されます.その後、retainを呼び出すたびに、カウント+1を参照します.releaseを呼び出すたびに、カウント-1を参照します.参照カウント=0なら、直接delete thisです.
関連インターフェースは以下の通りです.
例:
原則2:誰がretain、誰がreleaseを担当しますか?
例:
例:
三、自動釈放池——自動管理メモリ
原則4:autreleaseを使用する対象については、それに関わらず、各フレームが終了すると自動的にリリースされる.
関連インターフェース:
例:
四、CCNodeノード管理
cocococococos 2 d-xはノードを使って木を作って、レンダリングする時この木を遍歴します.CCNodeはすべてのノード類の親であり、彼の内部ではCCArayオブジェクトを使用して彼のすべてのサブノードを管理し、オブジェクトがサブノードに追加されると、実際にはCCArayオブジェクトに追加され、同時にこのオブジェクトのretain方法を呼び出す.同じように、CCArayから除去すると、release方法も呼び出されます.
関連インターフェース:
五、静工場
cocococococos 2 d-xには多くの静的工場法があり、これらの方法はすべてautrelease関数を呼び出す.CCSpriteのようなこれらの方法:
これらの方法の内部は,メモリ割り当て,初期化,autreleaseの設定を実現した.静的な工場で対象を生成し、コードを簡略化することができるというのが、公式提案の方法です.
六、cacheメカニズム類
cococococos 2 d-xにはcache類があります.これらは全部単例類のマネージャです.
CCAnimationCache
CCSpriteFraameCache
CCTextureCache
これらのcacheの内部にもRatainとreleaseの方法が使用されており、これらの資源が放出されるのを防ぐ.
これらのcacheを使って、私達はプリロードされたいくつかのリソースを保存して、便利な時にそれを呼び出して、いくつかのオブジェクトにバインディングします.なお、これらのcacheはシーン切り替え時に自動的に削除されず、手動でpurgeXXXX方法を起動してクリーンアップする必要があります.
一、概要
cocococos 2 d-xは最初にcococos 2 dのobjective Cバージョンから移植されます.したがって、メモリ管理にはNSObjectと同様の参照カウンタ方法が用いられ、関連インターフェースはCCObjectクラスに配置される.
二、参照カウンタ——手動でメモリを管理する
CCObjectのおよびそのサブクラスのオブジェクトは、作成時に参照カウントが自動的に1に設定されます.その後、retainを呼び出すたびに、カウント+1を参照します.releaseを呼び出すたびに、カウント-1を参照します.参照カウント=0なら、直接delete thisです.
関連インターフェースは以下の通りです.
- // +1
- virtual void CCObject::retain(void);
- // -1; =0, delete this;
- virtual void CCObject::release(void);
- //helper ,
- bool CCObject::isSingleRefrence(void);
- //
- unsigned int CCObject::retainCount(void);
原則1:誰が(new、copy)を生成しますか?誰がreleaseを担当しますか?例:
- CCObject *obj=new CCObject;
- ...
- obj->release();
retainは、ポインタの伝達と賦課に用いられ、彼の意味は所有を表す.これはよくポインターに使われます.原則2:誰がretain、誰がreleaseを担当しますか?
例:
- obj->retain();
- ...
- obj->release();
原則3:賦課を伝達する時、先にretainの形参が必要で、後でrelease原針、最後に値を賦課します.(但し、ここでは自己割当検査を使用していないので、この順番は間違ってはいけません.)例:
- void CCNode::setGrid(CCGridBase* pGrid)
- {
- CC_SAFE_RETAIN(pGrid);
- CC_SAFE_RELEASE(m_pGrid);
- m_pGrid = pGrid;
- }
三、自動釈放池——自動管理メモリ
原則4:autreleaseを使用する対象については、それに関わらず、各フレームが終了すると自動的にリリースされる.
関連インターフェース:
- CCObject* CCObject::autorelease(void);
例:
- CCObject *obj=new CCOjbect;
- obj->autorelease();
- ...
完全手動でメモリを管理していて、煩雑です.cococococos 2 d-xは自動放出池CCPoolManagerを提供しています.自動レリーズプールにオブジェクトを置いて、各フレームの描画が終了すると、自動的にreleaseプールのオブジェクトが表示されます.四、CCNodeノード管理
cocococococos 2 d-xはノードを使って木を作って、レンダリングする時この木を遍歴します.CCNodeはすべてのノード類の親であり、彼の内部ではCCArayオブジェクトを使用して彼のすべてのサブノードを管理し、オブジェクトがサブノードに追加されると、実際にはCCArayオブジェクトに追加され、同時にこのオブジェクトのretain方法を呼び出す.同じように、CCArayから除去すると、release方法も呼び出されます.
関連インターフェース:
- virtual void addChild(CCNode * child);
- virtual void addChild(CCNode * child, int zOrder);
- virtual void addChild(CCNode * child, int zOrder, int tag);
- virtual void removeChild(CCNode* child, bool cleanup);
- void removeChildByTag(int tag, bool cleanup);
- virtual void removeAllChildrenWithCleanup(bool cleanup);
シーンを切り替える時、システムはツリー全体のノードを巡回して、releaseを行います.五、静工場
cocococococos 2 d-xには多くの静的工場法があり、これらの方法はすべてautrelease関数を呼び出す.CCSpriteのようなこれらの方法:
- static CCSprite* spriteWithTexture(CCTexture2D *pTexture);
- static CCSprite* spriteWithTexture(CCTexture2D *pTexture, const CCRect& rect);
- static CCSprite* spriteWithTexture(CCTexture2D *pTexture, const CCRect& rect, const CCPoint& offset);
- static CCSprite* spriteWithSpriteFrame(CCSpriteFrame *pSpriteFrame);
- static CCSprite* spriteWithSpriteFrameName(const char *pszSpriteFrameName);
- static CCSprite* spriteWithFile(const char *pszFileName);
- static CCSprite* spriteWithFile(const char *pszFileName, const CCRect& rect);
- static CCSprite* spriteWithBatchNode(CCSpriteBatchNode *batchNode, const CCRect& rect);
これらの方法の内部は,メモリ割り当て,初期化,autreleaseの設定を実現した.静的な工場で対象を生成し、コードを簡略化することができるというのが、公式提案の方法です.
六、cacheメカニズム類
cococococos 2 d-xにはcache類があります.これらは全部単例類のマネージャです.
CCAnimationCache
CCSpriteFraameCache
CCTextureCache
これらのcacheの内部にもRatainとreleaseの方法が使用されており、これらの資源が放出されるのを防ぐ.
これらのcacheを使って、私達はプリロードされたいくつかのリソースを保存して、便利な時にそれを呼び出して、いくつかのオブジェクトにバインディングします.なお、これらのcacheはシーン切り替え時に自動的に削除されず、手動でpurgeXXXX方法を起動してクリーンアップする必要があります.