使用Xcode Instruments Leak解决内存泄漏问题

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

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

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

step1:ide

   建立一个基于ARC的测试demo,部分测试代码以下:函数

   

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

step2:性能

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

  

   点击Profile Button编译,呵呵,报错了,若是你遇到这种状况也没关系张,先看下报错信息: ui

  

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

  

  为何正常编译就没问题,在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一次,这时候内存泄露的具体代码找到了,下面的红色框框里指定了那个方法出现了内存泄露。

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

step6:

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

  大饼摊完了,最后附上《Instruments 用户指南》有兴趣的同窗能够研究一下Instruments中其余工具的用法。

相关文章
相关标签/搜索