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です.
関連インターフェースは以下の通りです.
 

    
    
    
    
  1. // +1 
  2. virtual void CCObject::retain(void); 
  3. // -1; =0, delete this; 
  4. virtual void CCObject::release(void); 
  5. //helper ,  
  6. bool CCObject::isSingleRefrence(void); 
  7. //  
  8. unsigned int CCObject::retainCount(void); 
原則1:誰が(new、copy)を生成しますか?誰がreleaseを担当しますか?
例:

   
   
   
   
  1. CCObject *obj=new CCObject; 
  2. ... 
  3. obj->release(); 
retainは、ポインタの伝達と賦課に用いられ、彼の意味は所有を表す.これはよくポインターに使われます.
原則2:誰がretain、誰がreleaseを担当しますか?
例:

   
   
   
   
  1. obj->retain(); 
  2. ... 
  3. obj->release(); 
原則3:賦課を伝達する時、先にretainの形参が必要で、後でrelease原針、最後に値を賦課します.(但し、ここでは自己割当検査を使用していないので、この順番は間違ってはいけません.)
例:

   
   
   
   
  1. void CCNode::setGrid(CCGridBase* pGrid) 
  2.             CC_SAFE_RETAIN(pGrid); 
  3.             CC_SAFE_RELEASE(m_pGrid); 
  4.             m_pGrid = pGrid; 
 
三、自動釈放池——自動管理メモリ
 
原則4:autreleaseを使用する対象については、それに関わらず、各フレームが終了すると自動的にリリースされる.
関連インターフェース:

    
    
    
    
  1. CCObject* CCObject::autorelease(void); 
 
例:

   
   
   
   
  1. CCObject *obj=new CCOjbect; 
  2. obj->autorelease(); 
  3. ... 
完全手動でメモリを管理していて、煩雑です.cococococos 2 d-xは自動放出池CCPoolManagerを提供しています.自動レリーズプールにオブジェクトを置いて、各フレームの描画が終了すると、自動的にreleaseプールのオブジェクトが表示されます.
 
四、CCNodeノード管理
cocococococos 2 d-xはノードを使って木を作って、レンダリングする時この木を遍歴します.CCNodeはすべてのノード類の親であり、彼の内部ではCCArayオブジェクトを使用して彼のすべてのサブノードを管理し、オブジェクトがサブノードに追加されると、実際にはCCArayオブジェクトに追加され、同時にこのオブジェクトのretain方法を呼び出す.同じように、CCArayから除去すると、release方法も呼び出されます.
 
関連インターフェース:

   
   
   
   
  1. virtual void addChild(CCNode * child); 
  2. virtual void addChild(CCNode * child, int zOrder); 
  3. virtual void addChild(CCNode * child, int zOrder, int tag); 
  4. virtual void removeChild(CCNode* child, bool cleanup); 
  5. void removeChildByTag(int tag, bool cleanup); 
  6. virtual void removeAllChildrenWithCleanup(bool cleanup); 
シーンを切り替える時、システムはツリー全体のノードを巡回して、releaseを行います.
五、静工場
cocococococos 2 d-xには多くの静的工場法があり、これらの方法はすべてautrelease関数を呼び出す.CCSpriteのようなこれらの方法:

    
    
    
    
  1. static CCSprite* spriteWithTexture(CCTexture2D *pTexture); 
  2. static CCSprite* spriteWithTexture(CCTexture2D *pTexture, const CCRect& rect); 
  3. static CCSprite* spriteWithTexture(CCTexture2D *pTexture, const CCRect& rect, const CCPoint& offset); 
  4. static CCSprite* spriteWithSpriteFrame(CCSpriteFrame *pSpriteFrame); 
  5. static CCSprite* spriteWithSpriteFrameName(const char *pszSpriteFrameName); 
  6. static CCSprite* spriteWithFile(const char *pszFileName); 
  7. static CCSprite* spriteWithFile(const char *pszFileName, const CCRect& rect); 
  8. static CCSprite* spriteWithBatchNode(CCSpriteBatchNode *batchNode, const CCRect& rect); 
 
これらの方法の内部は,メモリ割り当て,初期化,autreleaseの設定を実現した.静的な工場で対象を生成し、コードを簡略化することができるというのが、公式提案の方法です.
六、cacheメカニズム類
cococococos 2 d-xにはcache類があります.これらは全部単例類のマネージャです.
CCAnimationCache 
CCSpriteFraameCache 
CCTextureCache 
これらのcacheの内部にもRatainとreleaseの方法が使用されており、これらの資源が放出されるのを防ぐ.
これらのcacheを使って、私達はプリロードされたいくつかのリソースを保存して、便利な時にそれを呼び出して、いくつかのオブジェクトにバインディングします.なお、これらのcacheはシーン切り替え時に自動的に削除されず、手動でpurgeXXXX方法を起動してクリーンアップする必要があります.