cocos2d-xV2.2.3发现addSpriteFramesWithFile和removeSpriteFramesFromFile有内存管理的问题??

一般我们调用addSpriteFramesWithFile函数传递plist文件的相对路径加载精灵帧资源
这样在m_pLoadedFileNames中保存的是plist文件的相对路径来防止重复加载资源
然后调用removeSpriteFramesFromFile函数传递plist文件的相对路径移除精灵帧资源

但是在createWidget函数中调用该方法是是通过传递plist文件的完整路径加载精灵帧资源
这样在m_pLoadedFileNames中保存的是plist文件的完整路径来防止重复加载资源

当通过createWidget加载一个资源(m_pLoadedFileNames中保存的是该资源的完整路径)
然后通过removeSpriteFramesFromFile传递该资源的相对路径来释放资源的话,会导致资源释放掉了但是m_pLoadedFileNames没有删除相应的资源路径(因为找不到该资源路径,保存的是完整路径,查找的却是相对路径),
这样的问题是,虽然资源释放了但是m_pLoadedFileNames仍记录了资源没有释放,这样当需要用到该资源的时候,会通过m_pLoadedFileNames判断该资源已经加载,但是实际上该资源已经释放了,进而会导致程序crash。

你好,该问题已经反馈到cocos2d-x团队。

var spriteFrameCache = cc.SpriteFrameCache.getInstance();
spriteFrameCache.addSpriteFrames(plist, png);
如果我动画这样封装createDonghua = function (plist, png,firstImage,count,bufangsudu) {
spriteFrameCache.addSpriteFrames(plist, png);
var animFrames = ];
var str = firstImage;
for (var k = 1; k <= count; k++) {
var frame = str.split(".") + k + “.”+str.split(".");
var frames = spriteFrameCache.getSpriteFrame(frame);
if(frames!=null){
animFrames.push(frames);
var animation = cc.Animation.create(animFrames,bufangsudu);
}
}
return cc.Animate.create(animation);

} 当然了 我知道可以把spriteFrameCache.addSpriteFrames(plist, png);这句话放在外部。 那若是上面这种方法 拿一个动画来说,那么每次运行动画都会执行spriteFrameCache.addSpriteFrames(plist, png); 这样是否会产生缓存的不断增加呢

3.2也发现这个问题了