Colin-Liao 个人原创,欢迎转载,转载请注明地址。Colin-Liao的专栏地址http://blog.youkuaiyun.com/focusdeveloper
我们都知道cocos2d-x的内存管理是延用的cocos2d的一套内存管理。那之前也读过论坛上很多大牛门写的关于内存管理的文章,那这里我 也谈谈自己的一些对内存管理的理解。
用cocos2d-x的新手们可能都遇到这样的问题,一不注意代码就崩溃或者又得到一个为空的对象,这是为什么呢,下面我们讨论一下这个原因。
首先我们介绍下c++的new和delete这对函数,我们在一个地方new了一个对象,那么如果我们不手动的释放即delete那么这个对象,那么他在他所在的作用域结束后不会被释放,直到程序结束。因为cocos2d-x使用c++写成的,所以我们也可以用这个方法来创建对象,但是看起来似乎多此一举,因为我们知道cocos2d-x的类中都有create()这个函数。
cocos2d-x中有自己的内存管理方式,那就是引用计数值,这个引用计数是什么呢?当我们创建一个对象时,将这个对象的引用计数值加1,创建完成时引用计数值就为1了。当这个对象的引用计数值为0时,这个对象将被释放。我们能操作引用计数值数量的函数接口为retain()和release(),retain()让对象的引用计数值手动加1,release()让对象的引用计数值手动减1。
Create()这个在cocos2d-x中用于创建对象的函数,这个函数创建对象时对象的引用计数值加1,然后调用rutorelease()这个函数,这个函数的作用在于将对象加入CCPoolManager内存管理中心(即自动释放池)中,自动释放池在对象的作用域结束的时候会自动的释放,即自动调用release()让对象的应用计数值减1为0。那么当我们不希望作用域结束的时候这个对象就被释放的时候该怎么办呢?我们可以选者手动的retain(),将这个对象的引用计数值加1,此时引用计数值为2,那么在作用域结束的时候对象的引用计数值会在自动释放池release()一次,此时引用计数值为1,即使在作用域结束的时候也不会被释放,但是当我们不用的时候记住一定要将其释放,以免内存泄漏。
这时有的童鞋有疑问了,为什么我的对象没有retain,但是在别的地方还是能够引用呢?比如说我把这个对象创建之后addchild到一个layer或者场景中。
这正是我接下来要说的,cocos2d-x中当我们将一个对象加入到数组(addobject())的时候会将这个对象的引用计数值加1,当从数组中removeObject()的时候将其引用计数值减1。因为在layer,scene或者node等中都有一个children数组用于存放他们的child,这就是为什么我们在把对象addchild到这些父节点中的时候在作用域完成之后还能够对其调用。我们在一个类的初始化函数中创建一个数组的时候需要将其retain,让他引用计数值手动加1,当初始化函数结束的时候这个数组对象的引用技术值仍为1,这样就可以对数组中加入对象了。那么这样的对象该什么时候释放呢,要是不释放,那么肯定会出现内存泄漏的问题,这里我们可以在这个类的析构函数中将这个对象release()。
先写到这里吧,有新加的东西我会再做修改。