问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

菜鸟求助,Analyze分析出内存泄漏

发布网友 发布时间:2022-04-21 18:09

我来回答

1个回答

热心网友 时间:2023-10-16 02:17

尽管iOS 5.0加入版本号之后ARC机制,由于相互引用关系是复杂的。内存泄漏可能仍然存在。于是,懂原理是非常重要的。
这里讲述在没有ARC的情况下,怎样使用Instruments来查找程序中的内存泄露。以及NSZombieEnabled设置的使用。
本文如果你已经比较熟悉Obj-C的内存管理机制。
实验的开发环境:XCode 4.5.2
1、执行Demo。
先下载一个实现准备好的内存泄露的Demo吧:leak app
下载下来。打开执行,程序是一个寿司的列表,列出各种寿司卷。试着选择里面的几行,应该是选第二行的时候就崩溃了。
崩溃截图:
在崩溃的地方断住了,知道crash的地方了,可是不知道详细crash的原因。
2、设置NSZombieEnabled
这是一个 “EXC_BAD_ACCESS”错误。
我们打开XCode的选项:“NSZombieEnabled” 。在crash时可能会给你很多其它的一些提示信息。
设置步骤:1

2:勾上红色框里的2:勾上红色框里的

执行。按刚才的操作选中当中的cell。再次crash,这次在output窗体会看到多了一项错误信息:
2012-11-28 13:22:08.911 PropMemFun[2132:11303] *** -[CFString respondsToSelector:]: message sent to deallocated instance 0x713ebc0
大概意思是:向已释放的内存发送消息。
也就是说使用了已释放的内存。在C语言相当于使用了“野指针”
执行。按刚才的操作选中当中的cell。再次crash,这次在output窗体会看到多了一项错误信息:
2012-11-28 13:22:08.911 PropMemFun[2132:11303] *** -[CFString respondsToSelector:]: message sent to deallocated instance 0x713ebc0
大概意思是:向已释放的内存发送消息。
也就是说使用了已释放的内存。在C语言相当于使用了“野指针”

看了下crash的这个语句,sushiString应该是没问题的,它是从stringWithFormat初始化出来的。那就是_lastSushiSelected的问题。
_lastSushiSelected指向了sushiString。sushiString是一个autorelease变量。 在第二次点击时。使用的是sushiString已经被释放,所以crash了。
那为_lastSushiSelected保留一下。就能够用了。
代码改动例如以下:
_lastSushiSelected = [sushiString retain];
执行,这时候不崩溃。
3、分析内存泄露(shift+command+b)
app不crash了。那看看有没有内存泄露。用XCode的Analyze就能分析到哪里有内存泄露

分析之后能够看到:
这里提示alertView没被释放。有内存泄露,那我们释放
[alertView release];
再分析,这个问题攻克了。
4、使用Instruments的leaks工具
分析内存泄露不能把全部的内存泄露查出来。有的内存泄露是在执行时。用户操作时才产生的。那就须要用到Instruments了。
按上面操作,build成功后跳出Instruments工具。选择Leaks选项,这时候寿司程序也执行起来了,选中list中的项,拖动等操作后,工具显示效果例如以下:
大家可能都能猜到,红色的柱子表示内存泄露了。怎么通过这个工具看到在哪泄露了呢? 先在工具栏按下红色的圆形button,把工具监视内存的活动停下来。
选择Leak,然后点中间十字交叉那,选择Call Tree.
这时候的Call Tree的可选项能够选了。选中Invert Call Tree 和Hide System Libraries,显演示样例如以下:
这时候内存泄露的详细代码找到了,在右边的红色框框里指定了哪个方法出现了内存泄露。
你仅仅要在这些方法上双击。就会跳转到详细的代码。,是不是非常方便。这里应该是提示100%内存会泄露。
6、解决内存泄露问题
问题找到了,那就解决吧
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
华硕笔记本电脑触摸板怎么开笔记本电脑触摸板怎么开启和关闭_百度知 ... 陕西职务侵占案立案准则 结婚后我的恋情维系了十年,怎么做到的? 玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 jquery.data为什么可以避免内存泄露?内存泄露是怎... 如何处理.NET中的内存泄露 如何检查内存泄露问题 内存泄漏有哪些 武汉有什么景点值得去 武汉必游景点是哪里?为什么武汉的本地人很少去呢? 去武汉旅游,去哪里比较好 冬季适合旅游的城市? 现在去武汉要到哪里玩比较好呢 武汉有哪些适合学生去旅行的地方? 武汉出发三天适合去哪里旅游? 冬天旅游去哪里比较好? 求武汉周边一日游攻略或者湖北旅游除武汉外的景点... 旅游去了武汉,有哪一些必去的景点? 元旦要去武汉,有哪些地方可以玩,住。 武汉周边省市有哪些值得去的景点? 9月底去哪里旅游好,本人武汉,咱小俩口想选择国内... 武汉有哪些好玩的旅游景点 武汉哪里适合旅游 武汉最值得打卡几大景点,每一个都很经典,你想来... 一般应用程序都用什么语言写的啊? C++如何检测内存泄漏 创建mesh,为什么会提示有内存泄漏 Win8系统内存泄露的问题如何修复 为什么lua语言中使用全局变量就会造成内存泄漏呢?? 求助服务器崩溃原因和解决方法 C++实现ArrayList数组,内存泄漏 win10内存泄漏,有没有必要重装系统 C++内存泄漏,编译通过 ,运行出错,请问怎么改代码 VC6.0内存泄漏怎么修复 如何定位 Node.js 的内存泄漏 桌面窗口管理器占用内存爆表,看了网上的解答后更... 用平板电脑看腾讯视频的美剧,怎么去掉中英文字幕呢 谁知道在电脑上qq视频怎么弄画面特效 电脑看腾讯视频画面很卡 为啥我电脑的腾讯视频打开了 就和装系统的画质一样... 苹果电脑怎么下腾讯视频? 电脑桌面的腾讯影视库是什么 笔记本电脑用腾讯视频后,桌面为什么会出现个腾讯... 拖把是在洗脸池里洗吗 在哪洗拖把