cocos2d-x内存管理机制-沈大海cocos2d-x教程6

时间:2023-02-07 19:03:04

c++内存机制,采用new关键字实例化的对象,必须在不使用的时候手动delete掉,否则new的时候开辟的内存就不能被回收,造成内存泄露

Npc * n1=new Npc();

if(exit=0)

{ delete n1;

}

cocos2d-x 内存管理的方式,cocos2d-x采用引用计数的方式进行内存管理,当一个对象的引用计数为0的时候,就会被引擎自动delete掉

在cocos2d-x中绝大多数类继承CCObject

 CCObject::CCObject(void)
{
    static unsigned int uObjectCount = 0;

    m_uID = ++uObjectCount;  //  对象id

    m_nLuaID = 0;

   m_uReference = 1;             //引用计数
    m_bManaged = false;       //是否自动autorelease
}

void CCObject::release(void)  //减少引用
{
    CCAssert(m_uReference > 0, "reference count should greater than 0");
    --m_uReference;

    if (m_uReference == 0)
    {
        delete this;
    }
}

void CCObject::retain(void) //增加引用
{
    CCAssert(m_uReference > 0, "reference count should greater than 0");

    ++m_uReference;
}

//////////////////////////////////////////自动处理

CCObject* CCObject::autorelease(void)
{
    CCPoolManager::sharedPoolManager()->addObject(this);

    m_bManaged = true;
    return this;
}

CCObject::~CCObject(void)
{
    if (m_bManaged)
    {
        CCPoolManager::sharedPoolManager()->removeObject(this);
    }

}

//////////////////////////////////////////////////////////////////// 自动释放池的释放是在哪里呢?大家可以研究下源码

在调试过程中可以跟踪对象的

    m_uReference = 1;             //引用计数
    m_bManaged = false;       //是否自动autorelease

这2个值来检查内存使用。

法则: 只要retain的放对应相同的release