您的位置:首页 > 移动开发 > Cocos引擎

cocos2d内存管理的一些学习总结

2013-10-16 10:17 309 查看
这些天处理一个程序里的内存泄漏问题,主要是ios应用里用到了一个cocos2d做的CCBlade效果插件。

主要步骤:

在viewController的viewDidLoad方法中获取CCDirector的一个实例:

CCDirector *director = [CCDirector sharedDirector];

然后初始化一个CCGLView:

CCGLView *glView = [CCGLView viewWithFrame:self.view.bounds
pixelFormat:kCCTexture2DPixelFormat_RGBA8888
depthFormat:0
preserveBackbuffer:NO
sharegroup:nil
multiSampling:NO
numberOfSamples:0];

[director setView:glView];
glView.opaque=NO;
[director setAnimationInterval:1.0/30];
[self.view addSubview:glView];
[CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA8888];
[director pushScene: [HelloWorld scene]];

这样在加在当前view的时候就在当前view之上新建了一个view,并推入一个新的场景。

之后在场景之中做了一系列操作。

viewController的dealloc方法中:

-(void)dealloc{
[[CCDirector sharedDirector] end];
[super dealloc];

}

来在最后进行关闭。

发现这种方法每次开关操作,都会遗留大约0.02M的内存没有释放。而且用Instrument查看不会报内存泄漏。

又复习了下cocos2d的内存管理,知道:cocos2d在内存管理方面做得很出色,编码者只要在retain上加以注意,其他的内存释放问题都由cocos2d自己负责。

关于场景内存的管理问题,cocos2d会在场景切换之后完成,当新的场景调入内存之后,原先场景的内存就会释放。

可是采用上述方法,发现在director结束之后,之前的场景并没有被释放掉,连场景中的NSTimer还在努力的工作。

查了半天资料也没找到如何手动释放场景。

后来用断点跟踪了程序的执行,发现:

[[CCDirector sharedDirector] end]


会首先执行:

[runningScene_ onExit];
[runningScene_ cleanup];
[runningScene_ release];

原来场景确实已经退出了,但是为什么没有执行场景的dealloc方法,这个之后还得看一下dealloc和onExit的区别。看完再把这块补上。

于是只好去场景中添加onExit方法,在方法中释放场景中申请的各项内存。问题解决。
不过在onExit方法中添加的[self removeAllChildrenWithCleanUp:YES] 似乎并没有起作用。有待进一步研究。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: