内存泄漏问题和removeFromParentAndCleanup(false)问题

1, 控件UILabelBMFont 经测试有内存泄漏问题,管理员帮测试验证一下吧
2,
removeFromParentAndCleanup(false) 设成false后,调用对象依然会被释放
,因为detachChild(CCNode *child, bool doCleanup)里,最后一句是m_pChildren->removeObject(child)
而不是m_pChildren->removeObject(child, doCleanup),默认是删除与传进来的参数无关.不知道理解的对不对.请指正啊

释放不释放跟引用计数有关,跟你是否cleanup无关
那个变量只影响是否调用cleanup函数

我在应用中控件B原来挂在A上,我调用b->removeFromParentAndCleanup(false),想把B摘掉 然后挂到C上,结果崩溃.
跟代码发现最后removeObject(child) 把B指针的delete了, 修改为removeObject(child, doCleanup)后就正常了

所以一般换父结点都是先retain,换完之后再release
确实,你这么改就省了两行了

有道理 又学到一招.谢谢

Good…帮我解决了

我用cocostudio创建自定义字体后,放到工程中运行也发现有内存泄漏的情况。

仔细分析源码,应该发现removeFromParentAndCleanup(false),false或者true–是针对该节点上的action是否cleanup(),而不是说true-删除节点,false不删除节点.所以这是理解的问题,调用这个函数的目的就是移除节点(只不过你可以选择是否把节点上的action清除掉)

对于你说的修改最后一句m_pChildren->removeObject(child) 改为最后一句是m_pChildren->removeObject(child, doCleanup)
看了一下这个函数的实现removeObject的第二个参数默认值是true,那这个bool值代表着是否release一下(release一次,引用计数就会减去1),然后释放工作就是有自动内存管理器来处理了autorelease(不当之处请指正) :5:

补充一下:可以参考一下这个人的理解http://bbs.9ria.com/thread-253256-1-1.html
他是主动retain了一下(引用计数+1),所以当调用到m_pChildren->removeObject(child, doCleanup) 的时候,如果true–调用release(引用计数-1),如果为false–则不会调用release。然后自动释放机制会检查引用计数,然后决定是否做清除操作–delete

注:1、(创建一个对象时引用计数初始化为1,如果检测到引用计数为0的时候才会做清除操作–delete)
2、removeFromParentAndCleanup函数实现把自己从父节点移除掉(如果你retain了,那这个节点没有自动释放依然存在,但是他已经独立出来了(即没有父节点了,因为已经parent设置为null了))