首页 > 代码库 > cocos2d 内存管理

cocos2d 内存管理

-- 不要怕,勇敢的迈出第一步,加油!!!!!--


此章介绍cocos2d 中的内存管理


1. cocos2d 中的所有Node类都继承于Ref,Ref中有引用计数的概念,如下:

class TestRef  : public Ref {

public:

    TestRef() {}

    virtual ~TestRef() {}

};

new TestRef -- 这时class Ref 中的_referenceCount = 1

retain -- _referenceCount++

release -- _referenceCount--, 如果_referenceCount == 0, 析构这个class

autoRelease -- 把this 放入PoolManager 内存池中. 当PoolManager回收时,就会把这个class回收到,并且析构。


例子1

auto p = new TestRef();   _referenceCount = 1

p->retain();       _referenceCount = 2

p->release();  _referenceCount = 1

p->release(); _referenceCount = 0, 析构p


例子2

auto p = new TestRef();   _referenceCount = 1

p->autoRelease();   当PoolManager回收时,就会把这个class回收到,并且析构。


这个就是cocos2d 中的内存管理。

如果我们在使用一些sprite,layer,scene时,在addChild的前后,如果不是特殊需要,不要调用其retain或者release,因为在创建后,这个组件都调用了autoRelease,并在其父节点释放后,其子节点都会释放的。


2. 不要在组件的继承类中保存如何的非Node类的成员变量,什么意思呢?如下,这里只是简单的描述一下哈,

class TestLayer : public layer {

public:

    virtual ~TestLayer() {

        t->release();

    }

    CREATE_FUNC(Fight);

private:

    TestRef *t;

};


bool TestLayer::init() {

    if (!Layer::init())

        return false;

    t = new TestRef();

    return true;

}

把当前的TestLayer加入Scene中,然后程序退出,Scene和TestLayer都会被析构掉。在TestLayer的析构中,我们要把TestRef也析构掉,但是在TestLayer的析构函数断点中,我看到 t 是一个无效的指针,并且TestRef的析构函数没有被调用过,“内存泄露”了,怀疑如下:仅供个人参考,如果有人知道具体答案,请告知,谢谢~~~~

在TestLayer析构之前,其内部的所有子组件都会被析构掉,并且其所有成员变量都被重置成野指针,这是什么原因,我还没有搞清楚,内存泄露,程序退出时就会挂掉,大家可以根据这个,判断其是否内存泄露,什么地方内存泄露,还是很有用的。


结论:

1. cocos2d 的内存管理有效的解决某些童鞋忘掉释放内存的习惯,当然这个习惯不好哈。

2. 不能在组件的继承类中保存任何成员变量的对象,谨记。



cocos2d 内存管理