`
zxs19861202
  • 浏览: 915344 次
  • 性别: Icon_minigender_1
  • 来自: 湖北—》上海
社区版块
存档分类
最新评论

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

    博客分类:
  • ios
 
阅读更多

虽然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%内存会泄露。
 

6、解决内存泄露问题

问题找到了,那就解决吧

关于:tableView:didSelectRowAtIndexPath ,分析下它的内存过程:

 

  1. sushiString变量通过autorelease创建,它的引用计数是1.   
  2. 这行代码使得引用计数增加到2, _lastSushiSelected = [sushiString retain];
  3. 这个方法结束时,sushiString的autorelease生效了,这个变量的引用计数减少为1
  4. 当再次执行tableView:didSelectRowAtIndexPath这个方法时,_lastSushiSelected被赋值了新指针,老的_lastSushiSelected的引用计数还是1,没有被释放,产生了内存泄露。

 

怎么解决呢?

_lastSushiSelected = [sushiString retain];之前把原来的release就ok了:

 

[cpp] view plaincopy
 
  1. [_lastSushiSelected release];  
  2.     _lastSushiSelected = [sushiString retain];  

 

 

关于:tableView:cellForRowAtIndexPath

这个比较明显,sushiString被alloc和init之后就没有释放,可以用stringWithFormat来调用autorelease,代码如下:

 

[cpp] view plaincopy
 
  1. NSString *sushiString = [NSString stringWithFormat:@"%d: %@", indexPath.row, sushiName];  

 

 

好了,泄露都fix了,再用工具分析看看,这时候你再点,再拖,再怎么操作,都没有内存泄露了。表明内存泄露被堵住了。

 

转载:http://blog.csdn.net/totogo2010/article/details/8233565

  • 大小: 170.8 KB
  • 大小: 95.4 KB
  • 大小: 25 KB
  • 大小: 145.3 KB
分享到:
评论

相关推荐

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

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

    xcode ios 11.2调试包

    4. **调试技巧**:充分利用Xcode的性能分析工具(如Instruments)进行内存泄漏检查、CPU使用率监控,以及UI性能评估。 5. **错误调试**:当遇到运行时错误或警告时,查看Xcode的控制台输出和日志,可以帮助定位问题...

    Xcode真机调试iOS14.6

    本文将深入探讨如何使用Xcode进行真机调试iOS 14.6版本的应用,包括安装与配置、设备连接、证书与配置文件、调试技巧以及常见问题解决。 首先,确保你已经安装了最新版本的Xcode,该版本应兼容iOS 14.6。Xcode可以...

    Xcode12 iOS14.1 真机调试包

    4. **性能分析**:Xcode 12增强了性能分析工具,如Instruments,帮助开发者定位和优化内存泄漏、CPU占用等性能问题。 5. **代码签名和自动配置**:Xcode 12简化了代码签名流程,自动处理许多配置问题,减少了开发者...

    xcode真机调试iOS 12.1(16B91、16B92)真机调试包

    本文将深入探讨如何使用Xcode进行iOS 12.1(16B91和16B92)版本的真机设备调试,以及相关注意事项。 首先,Xcode是Apple官方提供的集成开发环境(IDE),用于开发macOS、iOS、watchOS和tvOS的应用程序。它包含了...

    iOS 13.6 xcode 真机包iOS 13.6 xcode 真机包

    7. **调试与性能优化**: 使用Xcode的真机测试功能,开发者可以利用内置的调试工具,如Instruments,进行性能分析、内存泄漏检测和UI测试,以优化应用的性能和用户体验。 8. **代码签名与发布**: 在完成真机测试并...

    Xcode真机调试DiskImage iOS16.1

    首先,理解Xcode真机调试的概念:Xcode提供了强大的调试工具,如Instruments和LLDB,这些工具可以帮助开发者定位代码中的问题、监控性能和调试内存泄漏。真机调试则是在实际运行iOS系统的设备上运行应用,相比于...

    xcode 真机调试包 ios11.0

    在iOS开发过程中,Xcode是苹果官方推荐的集成开发环境(IDE),用于编写、测试和调试iOS应用程序。本文将深入探讨“xcode 真机调试包 ios11.0”这一主题,涵盖Xcode的基本功能、真机调试的重要性、iOS 11.0系统特性...

    xcode 11.3 真机调试包

    通过Xcode的调试工具栏,你可以控制应用的执行流程,设置断点,查看变量值,以及分析内存和CPU的使用情况。 此外,Xcode 11.3还提供了强大的Interface Builder,让开发者可以直接在设计视图中构建用户界面,而无需...

    Xcode9 真机调试iOS11.1 (真机调试包)

    通过真机调试,开发者可以直接在设备上观察这些问题,利用Xcode的调试工具进行诊断,例如用 Instruments 进行内存和CPU性能监控,或用Leak检测内存泄漏。 总之,"Xcode9 真机调试iOS11.1”是一个iOS应用开发的关键...

    iOS内存泄漏调试工程

    在iOS开发中,内存泄漏是常见...理解并掌握上述知识点,能有效帮助开发者在实际项目中避免和解决内存泄漏问题。通过深入研究AsyncImageTableviewDemo,可以进一步巩固对这些概念的理解,并提升iOS应用的性能和稳定性。

    ios_调试内存泄漏

    为了有效地识别和解决内存泄漏问题,iOS开发者可以利用Xcode自带的工具进行分析和调试。以下是两种查看和调试iOS内存泄漏的方法: 一、利用Xcode查看内存泄漏 Xcode提供了一个静态分析工具,可以在代码编译阶段...

    ios12.0 xcode真机调试包

    在iOS开发过程中,Xcode是苹果官方提供的集成开发环境(IDE),用于编写、测试和调试iOS应用程序。这个“ios12.0 xcode真机调试包”似乎是一个针对iOS 12.0版本的特殊配置或更新,允许开发者在真实设备上进行应用的...

    xcode 真机调试包 ios10.2

    5. 使用Instruments:Xcode的Instruments工具提供了一系列性能分析工具,可以帮助你检测内存泄漏、CPU使用率等问题,优化应用性能。 六、持续测试和更新 随着应用的迭代,开发者需要不断在iOS 10.2设备上进行测试,...

    Xcode iOS 12.3真机调试包

    在调试过程中,Xcode提供了强大的调试工具,如LLDB调试器、Instruments性能分析工具、View Debugging和Activity Monitor等。这些工具可以帮助开发者查找和修复代码中的错误,优化性能,以及检查内存泄漏等问题。 总...

    iOS11.1 真机调试包

    7. **调试工具**: Xcode内置了强大的调试工具,如LLDB(Low Level Debugger)和Instruments,可以帮助开发者定位代码错误、性能瓶颈和内存泄漏等问题。真机调试环境下,这些工具能提供更为准确的反馈,因为它们直接...

    xcode 11.3真机调试包

    4. 内存泄漏:使用Instruments工具检测并修复内存泄漏问题。 总结,Xcode 11.3真机调试包为开发者提供了一个高效、全面的调试环境,通过熟练掌握其使用,开发者能够更好地优化代码,提高应用的质量和用户体验。无论...

    xcode 真机调试包 ios11.1

    在iOS开发过程中,Xcode是苹果官方提供的集成开发环境(IDE),用于编写、测试和调试iOS及macOS应用。这个“xcode 真机调试包 ios11.1”显然是针对Xcode的一个特定版本,专门用于在运行iOS 11.1系统的设备上进行真机...

Global site tag (gtag.js) - Google Analytics