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

本文详细介绍了在iOS应用中使用Cocos2d插件时遇到的内存泄漏问题,通过分析代码流程,发现场景并未在director结束时正确释放。通过添加场景的onExit方法并手动释放内存,最终解决了内存泄漏问题。

这些天处理一个程序里的内存泄漏问题,主要是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] 似乎并没有起作用。有待进一步研究。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值