IOS平台cocos2d-x 内存释放问题的解决方案
2012-10-25 09:14
344 查看
晚上帮同学看一个Cocos2d-x项目的内存释放问题,win32的版本运行没有问题,占用内存只有20多mb,但是在IOS平台上,没有切换几个场景就crash掉了。
编译期间发现了几个问题这里记录一下:
(1)在win32 下,CCLayer中 init()如果忘了添加返回值return true,是不会有问题的,但是在IOS版本上,同样的代码在xcode中虽然编译会通过,但是在运行的时候,CCNode是无法addChild的,所以请各位习惯不好的童鞋注意了~~
(2)cocos2d-x 在 1.0.11 的版本中 touches->locationInView()需要参数,而 1.0.12 的版本中不需要则不需要。 所以两个平台cocos2d-x的版本一定要统一。
好了,编译通过,下面来说一下是怎么解决内存释放的问题的
先向大家介绍一个工具:Xcode自带Instruments,通过它可以看到应用程序占用的实时内存和cpu信息(当然它的功能不止这些~~~)。具体怎么使用,后面的文章我会详细介绍一下的。
第一次查看
(1)连接真机,将应用程序编译到真机上。
(2)从 Instruments 中启动应用程序
(3)发现程序启动的时候,只占用了8Mb 左右的内存,然后点击切换场景
(4)切换场景中内存占用了30Mb,切换完成后内存依旧是30Mb
(5)继续切换,内存占用量不断增加,全部场景没有切换完,程序crash
初步分析,切换场景以后内存没有释放,开始检查代码:
(1) 检查 调用了 retain()方法的对象,看看有没有在OnExit()中没有调用release()的 【全部都加了release,不是这个问题】
(2) 在 onExit() 方法中手动调用 CCDirector::shareDirector->purgeDatacache()清理Cache 【内存占用量,稍有降低,但绝不是问题的根源】
(3) 检查了 CClayer 的创建方式,确认了 调用 autorelease() 都是用的 CClayer::node();方法内自动调用了 autorelease(),如果是 通过类似new CCLayer的话,需要手动调用 autorelease()【好吧,也不是这个问题】
(4) 没办法,继续检查 OnExit()函数 【对,就是它,就是它,就是它.....】
(5) 终于找到问题的原因了,在onExit()的时候,没有调用 父类的 OnExit(), CCLayer::OnExit();只是添加了retain对象的release的话,是不会把当前Layer的内存释放掉的。 【Fix it!!!!!!】
(6) Command+R内存始终20Mb 。
编译期间发现了几个问题这里记录一下:
(1)在win32 下,CCLayer中 init()如果忘了添加返回值return true,是不会有问题的,但是在IOS版本上,同样的代码在xcode中虽然编译会通过,但是在运行的时候,CCNode是无法addChild的,所以请各位习惯不好的童鞋注意了~~
(2)cocos2d-x 在 1.0.11 的版本中 touches->locationInView()需要参数,而 1.0.12 的版本中不需要则不需要。 所以两个平台cocos2d-x的版本一定要统一。
好了,编译通过,下面来说一下是怎么解决内存释放的问题的
先向大家介绍一个工具:Xcode自带Instruments,通过它可以看到应用程序占用的实时内存和cpu信息(当然它的功能不止这些~~~)。具体怎么使用,后面的文章我会详细介绍一下的。
第一次查看
(1)连接真机,将应用程序编译到真机上。
(2)从 Instruments 中启动应用程序
(3)发现程序启动的时候,只占用了8Mb 左右的内存,然后点击切换场景
(4)切换场景中内存占用了30Mb,切换完成后内存依旧是30Mb
(5)继续切换,内存占用量不断增加,全部场景没有切换完,程序crash
初步分析,切换场景以后内存没有释放,开始检查代码:
(1) 检查 调用了 retain()方法的对象,看看有没有在OnExit()中没有调用release()的 【全部都加了release,不是这个问题】
(2) 在 onExit() 方法中手动调用 CCDirector::shareDirector->purgeDatacache()清理Cache 【内存占用量,稍有降低,但绝不是问题的根源】
(3) 检查了 CClayer 的创建方式,确认了 调用 autorelease() 都是用的 CClayer::node();方法内自动调用了 autorelease(),如果是 通过类似new CCLayer的话,需要手动调用 autorelease()【好吧,也不是这个问题】
(4) 没办法,继续检查 OnExit()函数 【对,就是它,就是它,就是它.....】
(5) 终于找到问题的原因了,在onExit()的时候,没有调用 父类的 OnExit(), CCLayer::OnExit();只是添加了retain对象的release的话,是不会把当前Layer的内存释放掉的。 【Fix it!!!!!!】
(6) Command+R内存始终20Mb 。
相关文章推荐
- IOS平台cocos2d-x 内存释放问题的解决方案
- cocos2d 工程移植到iOS碰到的一些问题解决方案
- Cocos2d-x--Android平台部署及问题解决方案
- 【IOS】cocos2d-x 内存释放问题的解决过程
- cocos2d-x中CCEditBox 在iOS和安卓平台下 位置偏移的问题解决方法
- 移植cocos2d-x 游戏从Android平台到IOS平台分辨率问题及解决办法
- 【IOS】cocos2d-x 内存释放问题的解决过程
- iOS 平台 Cocos2d-x 项目 接入第三方SDK 的坑(就是静态库接入的问题)
- 移植cocos2d-x 游戏从Android平台到IOS平台分辨率问题及解决办法
- IOS下平台下微信图片错乱问题及解决方案
- 关于Cocos2d-x 3.0正式版 粒子问题在IOS上正常显示,在Android下有问题的解决方案
- 一步步教你学会iOS真机调试,常见证书问题的解决方案以及Xcode7之后免$99真机调试
- Google App Engine平台下JDOQL查询报异常的问题解决方案
- (译)cocos2d-x跨android&ios平台开发入门教程
- iOS平台内存常见问题
- WINCE平台上开发OPC程序所遇到的问题和解决方案
- 【iOS-Cocos2d游戏开发之十八】解决滚屏背景/拼接地图有黑边(缝隙)及禁止自动锁屏问题! 推荐
- Cocos2d-3.x_加载网页(Android和iOS平台)
- ios cocos2d 画线出现闪烁问题
- iOS平台一套完善的Crash Report解决方案