`
从此醉
  • 浏览: 1089262 次
  • 性别: Icon_minigender_1
  • 来自: US
社区版块
存档分类
最新评论

ios Instruments 内存泄露

 
阅读更多

虽然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保留一下,就可以用了。代码修改如下:

 

[cpp] view plaincopy
 
 
  1. <span style="font-size:14px;">    _lastSushiSelected = [sushiString retain];  
  2. </span>  

运行,这时候不崩溃。

 

3、分析内存泄露(shift+command+b)

app不crash了,那看看有没有内存泄露。用XCode的Analyze就能分析到哪里有内存泄露

 

分析之后可以看到:


这里提示alertView没被释放,有内存泄露,那我们释放

    [alertView release];

再分析,这个问题解决了。

 

4、使用Instruments的leaks工具

分析内存泄露不能把所有的内存泄露查出来,有的内存泄露是在运行时,用户操作时才产生的。那就需要用到Instruments了。
 
按上面操作,build成功后跳出Instruments工具,选择Leaks选项,这时候寿司程序也运行起来了,选中list中的项,拖动等操作后,工具显示效果如下:

 
大家可能都能猜到,红色的柱子表示内存泄露了。怎么通过这个工具看到在哪泄露了呢?
先在工具栏按下红色的圆形按钮,把工具监视内存的活动停下来。选择Leak,然后点中间十字交叉那,选择Call Tree.
 
 
这时候左下角的Call Tree的可选项可以选了。选中Invert Call Tree 和Hide System Libraries,显示如下:
 
这时候内存泄露的具体代码找到了,在右边的红色框框里指定了哪个方法出现了内存泄露。
你只要在这些方法上双击,就会跳转到具体的代码,哈哈,是不是很方便。
这里应该是提示100%内存会泄露。
2
0
分享到:
评论

相关推荐

    ios内存泄漏检测工具

    MLeaksFinder通过集成Xcode的Instruments工具,以及使用Runtime技术和Block来追踪可能的内存泄漏。它会在每个页面的生命周期结束时,检查并报告任何未释放的对象。特别是对于那些在页面生命周期中创建但在页面销毁后...

    iOS内存泄漏调试工程

    在iOS开发中,内存泄漏是常见的问题之一,它会导致应用消耗过多内存,影响性能,甚至导致应用崩溃。本文将深入探讨“iOS内存泄漏调试工程”中的核心知识点,并以提供的AsyncImageTableviewDemo为例进行讲解。 1. **...

    iOS instruments最新版英文

    iOS Instruments是一个性能分析工具,它被广泛用于开发iOS应用,帮助开发者优化应用的性能,特别是对于内存、CPU、网络和图形渲染等资源的使用情况。从提供的文件信息来看,该文件是一份iOS Instruments的用户指南,...

    不用 instruments 检测 app 内的内存泄露.zip

    针对这种情况,我们可以借助开源项目——HeapInspector-for-iOS来实现无需Instruments的内存泄露检测。 HeapInspector-for-iOS是一个专门用于检测iOS应用内存泄露的开源工具,它提供了一种替代Instruments的解决...

    ios_调试内存泄漏

    内存泄漏是iOS开发中的一个常见问题,它会导致应用的可用内存逐渐减少,最终可能导致应用崩溃或系统资源耗尽。为了有效地识别和解决内存泄漏问题,iOS开发者可以利用Xcode自带的工具进行分析和调试。以下是两种查看...

    使用Xcode和Instruments调试解决iOS内存泄露

    虽然iOS5.0版本之后加入了ARC机制,由于相互引用关系比较复杂时,内存泄露还是可能存在。所以了解原理很重要。这里讲述在没有ARC的情况下,如何使用Instruments来查找程序中的内存泄露,以及NSZombieEnabled设置的...

    iOS高级内存管理ARC模式手动模式英文文档含示例工程

    "crash调试"这部分可能涉及如何识别和解决由于内存问题导致的应用崩溃,这通常需要用到Xcode的调试工具,如Instruments,来分析内存分配和泄漏。 "反汇编"是另一个关键标签,它意味着这份资料可能深入到代码的底层...

    详解使用Xcode7的Instruments检测解决iOS内存泄露(最新)

    使用 Xcode7 的 Instruments 检测解决 iOS 内存泄露 在 iOS 开发中,内存泄露是一个非常严重的问题。这篇文章将主要介绍使用 Xcode7 的 Instruments 中的 Leaks 检测解决 iOS 内存泄露的相关知识点。 一、内存泄露...

    庄延军《iOS内存管理及优化》

    为了应对内存泄漏,书中可能会介绍各种检测和预防的技巧,例如使用Instruments工具来分析内存使用情况,并找到潜在的内存泄漏点。 除了内存泄漏,优化内存的使用也是书中的一大主题。这包括理解自动引用计数...

    IOS 常见内存泄漏以及解决方案

    * using Instruments 工具来检测内存泄漏 * 使用 ARC 或 MRC 机制来管理内存 * 手动释放对象 * 避免循环引用和死循环 结论: 内存泄漏是 IOS 开发中常见的问题,导致程序性能和稳定性下降。解决内存泄漏问题需要...

    Swift-MLeaksFinder腾讯开源的iOS平台的自动内存泄漏检测工具

    - 使用Instruments工具进行定期的手动内存泄漏检查。 - 对象生命周期管理遵循“谁创建,谁负责”原则。 - 尽量减少强引用,避免不必要的全局和静态对象。 - 定期进行代码审查,查找潜在的内存泄漏隐患。 总之,...

    Swift-OOMDetector是腾讯开源的一个iOS的内存监控组件

    内存泄漏是iOS应用性能下降的常见原因,Swift-OOMDetector具有强大的内存泄漏检测机制。它能够定位到可能导致内存泄漏的代码行,帮助开发者快速定位问题。通过对内存泄漏的定期检查,开发者可以及时修复内存泄漏问题...

    ios memory 内存管理

    苹果提供了一套强大的工具——Instruments,其中的Leaks工具可以帮助开发者检测内存泄漏,Time Profiler工具可以分析应用的性能瓶颈,Memory Monitor可以监控应用的实时内存使用情况。通过这些工具,开发者可以及时...

    内存泄露Demo leaky app

    1. 工具辅助:许多开发环境提供了专门的工具来检测内存泄露,如iOS的Instruments,Android Studio的Memory Profiler等。这些工具可以帮助开发者跟踪内存分配和释放,发现异常行为。 2. 代码审查:定期进行代码审查,...

    ios之内存管理

    7. **内存泄露检测**:利用Xcode内置的Instruments工具进行内存泄漏检测,及时发现并修复潜在的问题。 总的来说,iOS中的内存管理是开发者必须熟练掌握的重要技能。遛狗原则确保了对象的正确释放,自定义数组的内存...

    iOSUIWebView 优化 内存大大降低

    在iOS开发中,UIWebView是用于展示网页内容的重要组件,但它...持续关注内存监控,分析内存泄漏,也是优化过程中不可或缺的一环。在实际开发中,结合Instruments工具进行内存分析,可以帮助我们找到问题并及时解决。

    iOS内存管理1

    instruments是iOS开发中一个非常有用的工具,可以用来检测内存泄露和循环引用。 iOS内存管理是一个非常复杂的主题,需要开发者具备深入的知识和经验。开发者需要了解MRC和ARC的区别,强引用和弱引用的概念,循环...

    帮你快速发现 iOS 项目里的内存泄露.zip

    本文将深入探讨如何使用开源项目"PLeakSniffer"来快速定位和解决iOS项目中的内存泄露。 **PLeakSniffer** 是一个专为iOS开发者设计的开源工具,它能够自动化地检测和分析iOS应用的内存泄露。该项目主要基于Xcode...

Global site tag (gtag.js) - Google Analytics