虽然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:勾上红色框里的
运行,按刚才的操作选中其中的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保留一下,就可以用了。代码修改如下:
- <span style="font-size:14px;"> _lastSushiSelected = [sushiString retain];
- </span>
运行,这时候不崩溃。
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了:
- [_lastSushiSelected release];
- _lastSushiSelected = [sushiString retain];
关于:tableView:cellForRowAtIndexPath
这个比较明显,sushiString被alloc和init之后就没有释放,可以用stringWithFormat来调用autorelease,代码如下:
- NSString *sushiString = [NSString stringWithFormat:@"%d: %@", indexPath.row, sushiName];
好了,泄露都fix了,再用工具分析看看,这时候你再点,再拖,再怎么操作,都没有内存泄露了。表明内存泄露被堵住了。
转载:http://blog.csdn.net/totogo2010/article/details/8233565
相关推荐
使用 Xcode7 的 Instruments 检测解决 iOS 内存泄露 在 iOS 开发中,内存泄露是一个非常严重的问题。这篇文章将主要介绍使用 Xcode7 的 Instruments 中的 Leaks 检测解决 iOS 内存泄露的相关知识点。 一、内存泄露...
4. **调试技巧**:充分利用Xcode的性能分析工具(如Instruments)进行内存泄漏检查、CPU使用率监控,以及UI性能评估。 5. **错误调试**:当遇到运行时错误或警告时,查看Xcode的控制台输出和日志,可以帮助定位问题...
本文将深入探讨如何使用Xcode进行真机调试iOS 14.6版本的应用,包括安装与配置、设备连接、证书与配置文件、调试技巧以及常见问题解决。 首先,确保你已经安装了最新版本的Xcode,该版本应兼容iOS 14.6。Xcode可以...
4. **性能分析**:Xcode 12增强了性能分析工具,如Instruments,帮助开发者定位和优化内存泄漏、CPU占用等性能问题。 5. **代码签名和自动配置**:Xcode 12简化了代码签名流程,自动处理许多配置问题,减少了开发者...
本文将深入探讨如何使用Xcode进行iOS 12.1(16B91和16B92)版本的真机设备调试,以及相关注意事项。 首先,Xcode是Apple官方提供的集成开发环境(IDE),用于开发macOS、iOS、watchOS和tvOS的应用程序。它包含了...
7. **调试与性能优化**: 使用Xcode的真机测试功能,开发者可以利用内置的调试工具,如Instruments,进行性能分析、内存泄漏检测和UI测试,以优化应用的性能和用户体验。 8. **代码签名与发布**: 在完成真机测试并...
首先,理解Xcode真机调试的概念:Xcode提供了强大的调试工具,如Instruments和LLDB,这些工具可以帮助开发者定位代码中的问题、监控性能和调试内存泄漏。真机调试则是在实际运行iOS系统的设备上运行应用,相比于...
在iOS开发过程中,Xcode是苹果官方推荐的集成开发环境(IDE),用于编写、测试和调试iOS应用程序。本文将深入探讨“xcode 真机调试包 ios11.0”这一主题,涵盖Xcode的基本功能、真机调试的重要性、iOS 11.0系统特性...
通过Xcode的调试工具栏,你可以控制应用的执行流程,设置断点,查看变量值,以及分析内存和CPU的使用情况。 此外,Xcode 11.3还提供了强大的Interface Builder,让开发者可以直接在设计视图中构建用户界面,而无需...
通过真机调试,开发者可以直接在设备上观察这些问题,利用Xcode的调试工具进行诊断,例如用 Instruments 进行内存和CPU性能监控,或用Leak检测内存泄漏。 总之,"Xcode9 真机调试iOS11.1”是一个iOS应用开发的关键...
在iOS开发中,内存泄漏是常见...理解并掌握上述知识点,能有效帮助开发者在实际项目中避免和解决内存泄漏问题。通过深入研究AsyncImageTableviewDemo,可以进一步巩固对这些概念的理解,并提升iOS应用的性能和稳定性。
为了有效地识别和解决内存泄漏问题,iOS开发者可以利用Xcode自带的工具进行分析和调试。以下是两种查看和调试iOS内存泄漏的方法: 一、利用Xcode查看内存泄漏 Xcode提供了一个静态分析工具,可以在代码编译阶段...
在iOS开发过程中,Xcode是苹果官方提供的集成开发环境(IDE),用于编写、测试和调试iOS应用程序。这个“ios12.0 xcode真机调试包”似乎是一个针对iOS 12.0版本的特殊配置或更新,允许开发者在真实设备上进行应用的...
5. 使用Instruments:Xcode的Instruments工具提供了一系列性能分析工具,可以帮助你检测内存泄漏、CPU使用率等问题,优化应用性能。 六、持续测试和更新 随着应用的迭代,开发者需要不断在iOS 10.2设备上进行测试,...
在调试过程中,Xcode提供了强大的调试工具,如LLDB调试器、Instruments性能分析工具、View Debugging和Activity Monitor等。这些工具可以帮助开发者查找和修复代码中的错误,优化性能,以及检查内存泄漏等问题。 总...
7. **调试工具**: Xcode内置了强大的调试工具,如LLDB(Low Level Debugger)和Instruments,可以帮助开发者定位代码错误、性能瓶颈和内存泄漏等问题。真机调试环境下,这些工具能提供更为准确的反馈,因为它们直接...
4. 内存泄漏:使用Instruments工具检测并修复内存泄漏问题。 总结,Xcode 11.3真机调试包为开发者提供了一个高效、全面的调试环境,通过熟练掌握其使用,开发者能够更好地优化代码,提高应用的质量和用户体验。无论...
在iOS开发过程中,Xcode是苹果官方提供的集成开发环境(IDE),用于编写、测试和调试iOS及macOS应用。这个“xcode 真机调试包 ios11.1”显然是针对Xcode的一个特定版本,专门用于在运行iOS 11.1系统的设备上进行真机...