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