IOS 内存优化和调试技巧(基于cocos2d游戏)(4)
来源:未知 责任编辑:责任编辑 发表时间:2014-01-06 18:19 点击:次
2、然后就是直接使用Instruments中的leak监测。
申请了内存,然后已经没有指向这块内存的指针存在,可以认为是leak了。这个检测一般是检测这个状态。
3、通过Instruments中allocation的mark heap。
进行不断的重复操作,在每次场景结束后,标记内存。假如操作场景没有泄露,内存增加应该是0。这个检测是检测标记点之间有哪些对象增加。另外,需要多mark几次才会准确,不要mark两次看到有内存增加就去找问题。
Instruments中都是可以看到其中存在什么对象,调用历史,调用堆栈。这时候大致确定在那个类当中的那个对象泄露了。
二 ,重载法。
虽然知道了哪个类泄露了,但是有时候并不知道具体是那边的计数出现问题。我自己的方法是,假如是自己编写的类,那就重载retain和release方法,然后加断点。以此来监测是什么地方retain了这个对象,却没有对应释放。
如何修改内存泄漏呢 ?
1、缺啥补啥。缺release的,就补release,缺free的就加个free。
2、合理使用autorelease。对于返回给上层使用的;或者alloc对象到release中间有return等打断操作的。建议使用autorelease。
3、合理使用assign。retain cycle,本质就是多余的双向retain。打个比方就是应该确定哪个对象是根,哪一个是枝叶,枝叶不用去管理根,只需要知道根在那边就可以了。所以把那些纯粹是定位用的变量,属性都改成assign方式,例如delegate。
游戏中我遇到的一个非常难查的泄漏这里贡献出来 :
对于cocos2d的用户如果使用了CCMenu ,而且也重写了CCScene中的onExsit 函数来检测离开场景的时候的一些变化。但是忘了去调用super onExsit
这时候CCMenu自己注册了一个事件delegate 就无法释放导致CCMenu一直无法释放。当加载到了其他场景的时候事件总会不对。就是因为这个导致的
解决办法自然是调用super onExsit 。因为在这里他释放了delegate
这里给出游戏的主菜单一张
相关新闻>>
- 发表评论
-
- 最新评论 更多>>