使用Xcode和Instruments调试解决iOS内存泄露
来源:互联网 发布:网络黄金egd网址多少 编辑:程序博客网 时间:2024/05/18 20:50
这里讲述在没有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:勾上红色框里的
运行,按刚才的操作选中其中的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保留一下,就可以用了。代码修改如下:
运行,这时候不崩溃。
3、分析内存泄露(shift+command+b)
app不crash了,那看看有没有内存泄露。用XCode的Analyze就能分析到哪里有内存泄露
分析之后可以看到:
这里提示alertView没被释放,有内存泄露,那我们释放
[alertView release];
再分析,这个问题解决了。
4、使用Instruments的leaks工具
6、解决内存泄露问题
关于:tableView:didSelectRowAtIndexPath ,分析下它的内存过程:
- sushiString变量通过autorelease创建,它的引用计数是1.
- 这行代码使得引用计数增加到2, _lastSushiSelected = [sushiString retain];
- 这个方法结束时,sushiString的autorelease生效了,这个变量的引用计数减少为1
- 当再次执行tableView:didSelectRowAtIndexPath这个方法时,_lastSushiSelected被赋值了新指针,老的_lastSushiSelected的引用计数还是1,没有被释放,产生了内存泄露。
怎么解决呢?
在_lastSushiSelected = [sushiString retain];之前把原来的release就ok了:
关于:tableView:cellForRowAtIndexPath
这个比较明显,sushiString被alloc和init之后就没有释放,可以用stringWithFormat来调用autorelease,代码如下:
- iOS 【使用Xcode和Instruments调试解决iOS内存泄露】
- 使用Xcode和Instruments调试解决iOS内存泄露
- 使用Xcode和Instruments调试解决iOS内存泄露
- 使用Xcode和Instruments调试解决iOS内存泄露
- 使用Xcode和Instruments调试解决iOS内存泄露
- 使用Xcode和Instruments调试解决iOS内存泄露
- 使用Xcode和Instruments调试解决iOS内存泄露
- 使用Xcode和Instruments调试解决iOS内存泄露
- 使用Xcode和Instruments调试解决iOS内存泄露
- 使用Xcode和Instruments调试解决iOS内存泄露
- 使用 Xcode 和 Instruments 调试解决 iOS 内存泄露
- 使用Xcode和Instruments调试解决iOS内存泄露
- 使用Xcode和Instruments调试解决iOS内存泄露
- 使用Xcode和Instruments调试解决iOS内存泄露
- 使用Xcode和Instruments调试解决iOS内存泄露
- 使用Xcode和Instruments调试解决iOS内存泄露
- 使用Xcode和Instruments调试解决iOS内存泄露
- 使用Xcode和Instruments调试解决iOS内存泄露
- 一步一步教你用 Vue.js + Vuex 制作专门收藏微信公众号的 app
- struct stat结构体的详解和用法
- LZW压缩.java
- intellij 出现“Usage of API documented as @since 1.8+”的解决办法
- 设计模式分析感悟
- 使用Xcode和Instruments调试解决iOS内存泄露
- Image uImage zImage U-Boot的区别
- 4.1 Java语言和Kotlin语言对比(2) 泛型和数组
- struts2实现国际化,多语言切换
- hdu1197 水题(java版本)
- Vue.js学习系列二 —— vuex学习实践笔记(附DEMO)
- Vuex简单入门
- 深入解析StringBuilder与StringBuffer的区别
- windows用FileZillia sftp链接kali的方法