cocos2d-x 3.1中一个内存不释放问题

代码

local sprite1 = cc.Sprite:create('a.png');
local action = cc.DelayTime:create(1);
sprite1:runAction(action);

如果这里sprite1没有用addChild加入到任何scene中,直接丢掉的话,以后就再没有机会释放这个sprite了。而且sprite对应的图像也没有被释放,造成内存泄漏。


原因分析
当对一个node进行runAction时,ActionManager会对它执行retain操作。对应的,需要到stopAction时才会进行release。
正常情况下,一般把node加入到scene中。所以要么action执行结束自行停止。要么手动使用了stopAction。要么在上一级node调用removeChild的时候进入cleanup(会调用stopAllActions)。这些情况都不会造成问题。
但如果不把这个node加入到任何scene,那就不会自动执行到stopAction,所以始终不会release了。


发现过程
项目中封装了一个Effect类,大致是创建一个sprite然后用runAction(cocos2dx::Animate)来做帧动画,并返回创建的sprite。
后来希望预加载,就直接创建Effect但没有加入到任何scene中,直接丢弃。
结果出现上述问题,导致预加载的图片不能释放。


解决方案
如果node没有加入到任何scene,并且进行了runAction,那么必须手动stopAction。
因为会进行这种操作的场合并不多,一般也无需特别注意。只要检查所有的图片都正确释放,内存一般就不是大问题了。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值