cocos2d 内存管理

前端之家收集整理的这篇文章主要介绍了cocos2d 内存管理前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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


@H_403_1@

此章介绍cocos2d 中的内存管理@H_403_1@


@H_403_1@

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

class TestRef : public Ref {@H_403_1@

public:@H_403_1@

TestRef() {}@H_403_1@

virtual ~TestRef() {}
@H_403_1@

};@H_403_1@

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

retain -- _referenceCount++@H_403_1@

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

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


@H_403_1@

例子1
@H_403_1@

auto p = new TestRef(); _referenceCount = 1@H_403_1@

p->retain(); _referenceCount = 2@H_403_1@

p->release(); _referenceCount = 1@H_403_1@

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


@H_403_1@

例子2@H_403_1@

auto p = new TestRef(); _referenceCount = 1@H_403_1@

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


@H_403_1@

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

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


@H_403_1@

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

class TestLayer : public layer {@H_403_1@

public:@H_403_1@

virtual ~TestLayer() {@H_403_1@

t->release();
@H_403_1@

}
@H_403_1@

CREATE_FUNC(Fight);@H_403_1@

private:@H_403_1@

TestRef *t;
@H_403_1@

};@H_403_1@


@H_403_1@

bool TestLayer::init() {@H_403_1@

if (!Layer::init())@H_403_1@

return false;@H_403_1@

t = new TestRef();@H_403_1@

return true;
@H_403_1@

}@H_403_1@

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

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


@H_403_1@

结论:@H_403_1@

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

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

猜你在找的Cocos2d-x相关文章