记录关于cocos2dx内存管理机制可能崩溃的一个坑

大年初一写代码,纪念一下:)

cocos2dx,内存管理方式如下:

所有Ref继承而来的类,在create静态函数中会被放入AutoreleasePool,每一帧末尾释放一次,然后从AutoreleasePool中移除,如果此时其引用计数为0,则delete。

因此,你可以放心的创建,而不需要担心内存泄漏,因为如果创建出来没有人使用,就会被这AutoreleasePool销毁。让它初始ref+1的就各有方式了。最常见的就是CCNode,CCNode会在addChild时retain一次,removeChild时release一次。

因此如果你不手动掉用retain,这也是不会有问题的。如果你有需求在类中保存一个Ref对象,而它并非一个子节点,如RenderTexture,则必须记住自己写代码retain。

此处有一个容易出错的地方:如果你对这个Ref的create本身是在某个Update中做的,那应该当场retain一次。因为Update调用完AutoreleasePool紧接着就会release,直接导致Ref被删除,没机会坚持到下一帧。

因此,创建Ref之后,如果不将它放入cocos的容器中,则必须手动retain一次,并且记住在不使用时需要再release一次。

如果代码中使用了自己维护的Ref对象,而发生了莫名其妙的崩溃,不妨看看是不是这个问题。

posted @ 2017-01-28 13:29  长空小鹰  阅读(713)  评论(0)    收藏  举报