写于前:有很多写Leak教程的文章,当时在使用的时候一直卡在Step4,不能定位memory Leaks代码的位置,最后找到这篇文章的Step5说到dSYM文件。其他文章都没提及。

--->Xcode编译项目后,我们会看到一个同名的 dSYM 文件,dSYM 是保存 16 进制函数地址映射信息的中转文件

还有一个问题,之前在跑自己的demo的时候Cmd+I,一直闪退,具体原因没查出来。后来就先Cmd+R,之后通过下面的入口进去不会闪退~

啰嗦完了,下面看转载的正文吧~

----

iOS 5.0之后apple引入了Xcode编译器特性ARC(Automatic Reference Counting,自动引用计数)来帮助开发者管理内存,但为了追求app的高性能与减少安装包大小,工作中很多时候需要我们手动管理内存。再牛的开发者也不能保证自己写的code 100%没有内存泄露,出现内存泄露不可怕,可怕的是我们时间与精力花了大把,但内存泄露依旧没解决,即影响了工作效率也影响自己的心情。

  下面就讲解xcode中的内存调试神器---Instruments Leak ,不管是ios开发菜鸟,还是有经验的开发者,使用Instruments Leak调试内存泄露是必备技能之一。

  废话少说,下面开始摊大饼了!!!

step1:

   创建一个基于ARC的测试demo,部分测试代码如下:

  

  以上几行代码作为app代理入口method,IOS开发者应该是最熟悉不过了,由于创建的是手动管理内存工程,内存泄露的code line一眼就可以定位。

step2:

  使用Leaks开始动态分析,点击XCode的Product菜单Profile启动Instruments:

  

   点击Profile Button编译,呵呵,报错了,如果你遇到这种情况也不要紧张,先看下报错信息:

  

  MyViewController与MyNavigationController是我在.pch预编译文件中定义的宏:

  

  为什么正常编译就没问题,在Profile 中就编译通不过了,其实这里并不是你的代码写的有问题,问题出在Profile的一个编译选项上:

  打开工程的Edit Scheme选项

  

  选择Profile,将Build Configuration设置为Debug,这样在.pch文件中,#ifdef DEBUG 编译条件下定义的宏就生效 了。

  

  再次选择Profile building,OK, Success !!!

step3:

  进入Instruments主页面,选择Leak Logo

  

step4:

  这时Demo程序也运行起来了,工具显示效果如下:

  红色的柱子表示内存泄露了。怎么通过这个工具看到在哪泄露了呢?

先在工具栏按下红色的圆形按钮,把工具监视内存的活动停下来。选择Leak,然后点中间十字交叉那,选择Call Tree   
   

  这时候右下角的Call Tree的可选项可以选了。选中Invert Call Tree 和Hide System Libraries,显示如下:

  

  看到这里,你最想知道的应该是项目中哪里的code内存泄漏了,ok, 下面我们就来定位内存泄漏的code line .

step5:

  看上图中红色框中的Symbol Name 列,如果你猜想0xedc00与0xedbda是内存地址,那么已经很接近正确答案了,可是这东西对我来说有卵用。其实玄机就隐藏在这里,Xcode编译项目后,我们会看到一个同名的 dSYM 文件,dSYM 是保存 16 进制函数地址映射信息的中转文件,我们调试的 symbols 都会包含在这个文件中,并且每次编译项目的时候都会生成一个新的 dSYM 文件,关于dSYM更多的细节,我将在后面的blog中说明。回到上面的问题,显示0xedc00与0xedbda是因为我们的工程build settings 的问题,没有生成dSYM 文件,也就无法解析debug symbols。下面我们就来正确设置dSYM选项:

  

  设置好之后,重新 profile build一次,这时候内存泄露的具体代码找到了,下面的红色框框里指定了那个方法出现了内存泄露。(笔者注:开始卡在这里,总是定位不到内存泄漏的代码,后来将程序重新运行,重新打开instrument之后就OK了)

你只要在这些方法上双击,就会跳转到具体的代码,是不是很牛叉。

step6:

  解决内存泄漏问题,将创建的vc对象release掉就OK了,再用Instruments Leak工具分析看看,这时候再怎么操作,都没有内存泄露了。表明内存泄露被堵住了。

笔者通过Instrument检查到是由于AFNetworking这个库导致的内存泄漏,通过查阅资料得知,解决方法就是:

将AFHTTPSessionManager的实例使用单例模式获取。

原先在网络请求类中获取AFHTTPSessionManager是通过如下方法

AFHTTPSessionManager *manager = [[AFHTTPSessionManageralloc]initWithBaseURL:[NSURLURLWithString:URLHEAD]];

此方法就是导致内存泄漏的罪魁祸首,所以需要用单例获取AFHTTPSessionManager对象。

在AFHTTPSessionManager类中添加单例:

[objc] view plaincopy
  1. static AFHTTPSessionManager *manager;
  2. +(AFHTTPSessionManager *)sharedHttpSessionManager {
  3. static dispatch_once_t onceToken;
  4. dispatch_once(&onceToken, ^{
  5. manager = [AFHTTPSessionManager manager];
  6. manager.requestSerializer.timeoutInterval = 10.0;
  7. });
  8. return manager;
  9. }

使用时用以下方法:

AFHTTPSessionManager *manager = [[AFHTTPSessionManager sharedHttpSessionManager] initWithBaseURL:[NSURL URLWithString:URLHEAD]];

再来观察Instrument内存占用情况会发现

全是小绿勾,没有内存泄露了,嘿嘿~

附带相关链接:http://www.cnblogs.com/qiutangfengmian/p/6117856.html

使用Xcode Instruments Leak解决内存泄漏问题相关推荐

  1. Android 如何有效的解决内存泄漏的问题

    前言:最近在研究Handler的知识,其中涉及到一个问题,如何避免Handler带来的内存溢出问题.在网上找了很多资料,有很多都是互相抄的,没有实际的作用. 本文的内存泄漏检测工具是:LeakCana ...

  2. Android 性能优化 - 彻底解决内存泄漏

    起源 有趣的灵魂千奇百怪,内存泄漏的也是各式各样 我在15年写过一遍 文章 < android中常见的内存泄漏和解决办法>http://blog.csdn.net/wanghao20090 ...

  3. Memory Leak(内存泄漏)问题总结

    最近听了一些关于Memory Leak(内存泄漏)的seminar,感觉有些收获,所以留个记录,并share给朋友. 1 什么是Memory Leak. Memory Leak是指由于错误或不完备的代 ...

  4. [IPhone]如何使用Leak检查内存泄漏

    简介 在IPhone程式开发中,记忆体泄漏(内存泄漏)是个很容易发生的情况,因为IPhone必须自行作记忆体管理. 现在的开发者,大多习惯用的.NET或Java的等有垃圾回收机制的开发语言来作开发,因 ...

  5. 使用 Android Studio 检测内存泄漏与解决内存泄漏问题

    本文在腾讯技术推文上 修改 发布. http://wetest.qq.com/lab/view/63.html?from=ads_test2_qqtips&sessionUserType=BF ...

  6. android studio 解决内存泄漏

    自从Google在2013年发布了Android Studio后,Android Studio凭借着自己良好的内存优化,酷炫的UI主题,强大的自动补全提示以及Gradle的编译支持正逐步取代Eclip ...

  7. jstat 内存泄漏_基于Java内存dump文件分析解决内存泄漏问题

    概述 本文介绍一次解决现场java内存泄漏问题的经过,希望能提供后续遇到类似情况的读者一点思路. 生产环境发现的问题问题 生产环境运维人员反馈,服务器(windows系统)卡死,相关的服务都运行异常, ...

  8. 解决内存泄漏更加清楚的认识到Java匿名类与外部类的关系

    1.事件起因 在做项目的时候,通过Android Studio的Memory Monitor窗口观察程序内存使用情况,发现当程序退出的时候,有一部分应该释放掉的内存没有释放掉,知道程序中应该有内存泄漏 ...

  9. 内存优化-使用tcmalloc分析解决内存泄漏和内存暴涨问题

    其实我一直很想写关于tcmalloc的内存泄漏检测的文章,只是一直记不起来该如何下笔,有时项目太忙,在整理这方便的思考过少,另外遇到的问题也不是很多,直到最近用tcmalloc帮A项目排查一些很棘手的 ...

  10. # 学习记录1(C#-解决内存泄漏的几种方法)

    这里写自定义目录标题 myImageCodecInfo = GetEncoderInfo("image/jpeg");myEncoder = Encoder.Quality;myE ...

最新文章

  1. A*算法一个简单的记录
  2. 计算机科学与技术 物联网工,北京科技大学计算机与通信工程学院-王睿
  3. dom4j.jar有什么作用?
  4. mongodb书籍_我为什么放弃MySQL,选择了MongoDB?看到这个数据你就会明白了
  5. 运行control userpasswords2实现winXP自动登录
  6. php将excel日期转成时间戳,使用PHP将Excel日期编号转换为Unix时间戳时不匹配
  7. mysql 主从复制原理【转】
  8. 快捷指令获取url内容_快捷指令,钢铁侠里的“贾维斯”
  9. itextpdf生成表格的常见用法
  10. 火车票软件哪个好用_买火车票的软件哪个最好
  11. 手机安装W ndows7镜像,Windows7专业版
  12. 字节跳动-大数据研发面试准备
  13. 机房巨佬的随机名称生成器
  14. 服务开通语音通知功能如何实现?服务开通语音提醒功能实现方案
  15. 这些初创公司为何要拒绝上亿美元的投资
  16. Matlab中产生门函数----Heaviside函数的调用方法
  17. Metal每日分享,图像阀值素描滤镜效果
  18. 大数据基础教程丨TiDB数据库从入门到实践
  19. Zotero安装使用及上标问题解决
  20. Github上收集了70个微信小程序源码

热门文章

  1. javasript深度拷贝
  2. JavaScript Date时间对象
  3. 推荐系统必读的10篇精选技术文章
  4. win10安装kali组双系统
  5. break、continue
  6. Android 6.0 扫描不到 Ble 设备需开启位置权限
  7. 自然语言21_Wordnet
  8. My97 DatePicker 选择时间后弹出选择的时间
  9. PSP记录个人项目耗时情况
  10. No.0_Team C#