cocos2d-x 의 메모리 관리

|
cocos2d-x 는 아이폰의 autorelease Pool 개념을 사용하여 c++ 에서도 같은 방식으로 메모리 관리를 한다.

c++에서는 new를 해주면 delete를 해주듯이.

cocos2d-x는 new로 객체를 생성시 release()를 호출하여 메모리를 해제한다.

 

 

cocos2d-x의 모든 클래스는 CCObject클래스를 상속받는데 CCObject클래스는 생성자에서 m_uReference라는 값을 1로 만들어준다.

 

 

 m_uReference 의 값을 확인하는 함수는 retainCount()이다.

 

CCNode * node = new CCNode();   //CCNode의 m_uReference = 1 이됨

this->addChild(node);                    //CCNode의 m_uReference = 2 가됨   

this->removeChild(node,true);               //CCNode의 m_uReference = 1 가됨   

node->release();                          //CCNode의 m_uReference = -17891602(쓰레기값) 메모리해제됨    메모리 할당한값 전부 해제


addChilde시 m_uReference가 1 증가하고 , removeChild시  m_uReference가 1 감소한다. this의 m_uReference는 그대로 이다.

 

 

(메모리가 초기화 된것은 visual stduio에서 디버그-창-메모리-메모리1을 누르고 디버깅 모드에서 해당 주소값 입력후 초기화 되는지 확인하면 된다. 초기화가 되면 fe ee fe ee 이런식으로 값이 들어간다)

 

 

 

 

 

 

안전한 코드는 release()후 node = NULL을 입력시 안전한 코드가 된다. C++에서 delete후 null을 입력하는것과 마찬가지이다.

 #define SAFE_RELEASE(p) if ((p) != NULL) { delete (p); (p) = NULL; 

 

이런식으로 정의한후

SAFE_RELEASE(node);로 해도 된다


 

cocos2d-x에서도 자체 매크로를 제공한다


#define CC_SAFE_DELETE(p)            do { if(p) { delete (p); (p) = 0; } } while(0)

#define CC_SAFE_DELETE_ARRAY(p)     do { if(p) { delete[] (p); (p) = 0; } } while(0)

#define CC_SAFE_FREE(p)                do { if(p) { free(p); (p) = 0; } } while(0)

#define CC_SAFE_RELEASE(p)            do { if(p) { (p)->release(); } } while(0)

#define CC_SAFE_RELEASE_NULL(p)        do { if(p) { (p)->release(); (p) = 0; } } while(0)

#define CC_SAFE_RETAIN(p)            do { if(p) { (p)->retain(); } } while(0)

#define CC_BREAK_IF(cond)            if(cond) break


 

알아서 입맛에 맞게 매크로를 사용하면 된다.

 

 

void CCObject::retain(void)

{

    CCAssert(m_uReference > 0, "reference count should greater than 0");

 

    ++m_uReference;

}

 

void CCObject::release(void)

{

    CCAssert(m_uReference > 0, "reference count should greater than 0");

    --m_uReference;

 

    if (m_uReference == 0)

    {

        delete this;

    }

}

autoRelease란 사용자가 메모리 관리에 신경을 덜 써도 된다. ( m_uReference 가 1이면 자동으로 메모리에서 해제된다.)

 

 

싱글턴으로 선언된  CCPoolManager에서 관리되면 CCPoolManager가 메모리에서 해제될때 CCPoolManager의 객체들을 전부

release()해주므로 CCPoolManager의 객체중 m_uReference가 1인 것들은 0이되고 자동으로 delete가 된다.

autoRelease는 보통 create()메서드 (2.0이상부터는 전부 create로 변경되었다.) 로 호출되는건 전부 라고 생각하면 된다.

CCNode * node = CCNode::create(); 이런식으로 호출하면 된다.

 

 

CCNode * CCNode::create(void)

{

CCNode * pRet = new CCNode();

pRet->autorelease();

return pRet;

}

 

 

 

CCObject* CCObject::autorelease(void)

{

    CCPoolManager::sharedPoolManager()->addObject(this);

    return this;

}

Trackback 0 And Comment 0