Cocos2dx 内存管理机制(1)

本文详细介绍了Cocos2d-x的内存管理机制,特别是引用计数的概念。通过分析`CCObject`类,讨论了`retain`、`release`和`autorelease`方法的工作原理。讲解了如何手动和自动管理内存,以及`CCAutoreleasePool`在自动管理对象中的作用,强调了对象在自动释放池中引用计数的变化过程。
摘要由CSDN通过智能技术生成

1.引用计数机制

要了解cocos2dx引用计数的机制,首先我们来看看CCObject这个类


class CC_DLL CCObject : public CCCopying
{
public:
    // object id, CCScriptSupport need public m_uID
    unsigned int        m_uID;
    // Lua reference id
    int                 m_nLuaID;
protected:
    // count of references
    unsigned int        m_uReference;
    // count of autorelease
    unsigned int        m_uAutoReleaseCount;
public:
    CCObject(void);
    /**
     *  @lua NA
     */
    virtual ~CCObject(void);
    
    void release(void);
    void retain(void);
    CCObject* autorelease(void);
    CCObject* copy(void);
    bool isSingleReference(void) const;
    unsigned int retainCount(void) const;
    virtual bool isEqual(const CCObject* pObject);

    virtual void acceptVisitor(CCDataVisitor &visitor);

    virtual void update(float dt) {CC_UNUSED_PARAM(dt);};
    
    friend class CCAutoreleasePool;
};


说明:

● 当m_uReference=0时会自动释放该对象,每引用一次对象的时候,m_uReference会+1,当object被创建,会初始化为1.

● 当m_uAutoReleaseCount !=0时表示该对象自动释放(autorelease)。

void retain(void) 对m_uReference+1操作,可以防止对象被释放

retainCount() 返回m_uReference值


● 跟踪一下void release()方法,我们会发现是对引用计数m_uReference进行-1操作,为0时删除对象

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

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


2.使用引用计数手动管理内存


因此,如果我们想手动来管理内存的释放,我们可以使用这样子,


        CCSprite* sprite1=new CCSprite();
	sprite1->initWithFile("CloseNormal.png");
	CCLOG("sprite1 retain:%d",sprite1->retainCount());//sprite1 retain:1
	this->addChild(sprite1);         //addChild会对引用计数+1,可以跟踪看一下,最后会对object->retain()操作
	CCL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值