请教内存释放不干净问题

ulLoading->removeAllChildrenWithCleanup( true );
ulLoading->removeFromParentAndCleanup(true);
SceneReader::sharedSceneReader()->purge();
GUIReader::shareReader()->purge();
ActionManager::purge();

CCSpriteFrameCache::sharedSpriteFrameCache()->removeSpriteFrameByName("xxx.plist");//xxx.ExportJson对应的plist
CCTextureCache::sharedTextureCache()->removeTextureForKey("xxx.png");//xxx.ExportJson对应的png

请问layer退出的时候这样释放有没有问题,为什么第一次退出的时候会有400k左右的内存无法释放

楼主你先贴一下是哪个版本好吧,另建议将东西分开,以便找到具体泄露的是哪一个部分~

是2.2.2的版本,将东西分开是什么意思?我是用一个最简单的layer测试的

我以为你有用到多个编辑器的解析,如果只有一个layer的话,就将代码发上来吧。

#include “LoadingLayer.h”
LoadingLayer::LoadingLayer(void)
{

}

LoadingLayer::~LoadingLayer(void)
{
CCLOG("===release LoadingLayer");
CCNotificationCenter::sharedNotificationCenter()->removeObserver(this, “LoadingDone”);
}

bool LoadingLayer::init()
{
m_IsLoadingDone = 0;

return true;

}

void LoadingLayer::onEnter()
{

CCLayer::onEnter();
CCNotificationCenter::sharedNotificationCenter()->addObserver(this, callfuncO_selector(LoadingLayer::LoadingDone), "LoadingDone", NULL);
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCLog("====LoadingLayer::onEnter");
ulLoading = TouchGroup::create();
ulLoading->scheduleUpdate();
this->addChild(ulLoading,0,100);

//
//
UIWidget* widget = GUIReader::shareReader()->widgetFromJsonFile(“UIexport/loadingLayer/loadingLayer_1.ExportJson”);
ulLoading->addWidget(widget);

UILoadingBar* exitLoadingBar = dynamic_cast<UILoadingBar*>(ulLoading->getWidgetByName("LoadingBar_22"));
exitLoadingBar->setPercent(5);

this->schedule(schedule_selector(LoadingLayer::updateLoadingBar) , 0.1f);
setTouchEnabled(true);

}

void LoadingLayer::onExit()
{
CCLayer::onExit();

ulLoading->removeAllChildrenWithCleanup( true );
ulLoading->removeFromParentAndCleanup(true);
SceneReader::sharedSceneReader()->purge();
GUIReader::shareReader()->purge();
ActionManager::purge();

CCSpriteFrameCache::sharedSpriteFrameCache()->removeSpriteFrameByName("UIexport/loadingLayer/loadingLayer0.plist");
CCTextureCache::sharedTextureCache()->removeTextureForKey("UIexport/loadingLayer/loadingLayer0.png");

}

void LoadingLayer::LoadingDone(CCObject *obj)
{
m_IsLoadingDone = 1;
}

void LoadingLayer::updateLoadingBar(float cutTime)
{

}
=================layer 就这个===请问这么退出有什么问题吗?

你用CCTextureCache::sharedTextureCache()->removeAllTextures()这个方法清理下贴图吧。

GUIReader::shareReader()->purge(); 不会清理UI部分的贴图的

CCSpriteFrameCache::sharedSpriteFrameCache()->removeSpriteFrameByName("UIexport/loadingLayer/loadingLayer0.plist"); 
CCTextureCache::sharedTextureCache()->removeTextureForKey("UIexport/loadingLayer/loadingLayer0.png"); 

用这两句来清理也不行吗?

"UIexport/loadingLayer/loadingLayer0.png这是指定的图,我不清楚你的其他地方是否有使用默认图。
当然泄露也有可能是其他原因造成的。

我把CCTextureCache::sharedTextureCache()->m_pTextures打印出来了,发现texturecache里面确实没有增加其他的贴图了,
内存释放不干净呀,不知道咋办了 :6: :6: :6:

你的全局变量都已释放了吧?另外注意有些内存是在帧结束的时候才释放。
泄露的问题因为牵扯到引擎,所以还请耐心查找。

你的释放资源的时机不对。
CCSpriteFrameCache::sharedSpriteFrameCache()->removeSpriteFramesFromFile(“UIexport/loadingLayer/loadingLayer0.plist”);
CCTextureCache::sharedTextureCache()->removeUnusedTextures();

这两行代码就可以释放完不再使用的纹理了,但是,时机很重要。建议你看看CCLayer和CCNode的析构函数和onExit()函数。另外搞清楚析构函数的调用顺序。

调用 CCSpriteFrameCache::sharedSpriteFrameCache()->removeSpriteFramesFromFile(“UIexport/loadingLayer/loadingLayer0.plist”); 还不够,还得在LoadingLayer的析构函数彻底执行完之后
CCTextureCache中的 "UIexport/loadingLayer/loadingLayer0.png"的引用计数应该会是1。

但是在析构函数未执行完之前,它的引用计数未必会是1.
此时调用CCTextureCache::sharedTextureCache()->removeUnusedTextures();是没有效果的。因为这个函数只将引用计数为1的纹理释放掉。
cocos2d-x为何要这么做?去看看CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile这个函数你就明白了。

明白了这个,你可以将LoadingLayer从场景移除后,再调用CCTextureCache::sharedTextureCache()->removeUnusedTextures()。

希望能够帮到你。

非常感谢。。。 :11: :11: :11: :11:
还有我测试的时候是用
CCSpriteFrameCache::sharedSpriteFrameCache()->removeSpriteFrameByName(“UIexport/loadingLayer/loadingLayer0.plist”);
CCTextureCache::sharedTextureCache()->removeTextureForKey(“UIexport/loadingLayer/loadingLayer0.png”);
没有用
CCTextureCache::sharedTextureCache()->removeUnusedTextures();
甚至我也试过在onexit的时候直接
CCSpriteFrameCache::sharedSpriteFrameCache()->removeSpriteFrames();
CCTextureCache::sharedTextureCache()->removeAllTextures();
但是内存还是没释放干净