iOS Instrument Leaks

 Leaks

       Leaks 工具是一个跟踪全部由应用程序分配的内存工具,能够用来识别在应用程序里面的内存分配模式,并识别应用程序内存效率低下的地方。这是为了应用程序可以消除 内存泄露,进一步提升程序的可靠性,对于设计为长时间运行的程序尤其正确。(最新版本autorelease不会被断定为内存泄露) app

       Leaks Trace Template 用来测试内存使用、检查内存泄露、提供类的对象内存分配和泄露的内存的统计。它由Allocations和Leaks组成。 函数

用Leaks工具能够发现App再也不有引用指向的内存。Leaks工具提供这些内存块的报告。大部分这些内存泄露都是用类的名字来标识的,另外可能会用分配内存的大小标识。 工具

定位泄露的内存

  1. 打开Leaks Template。
  2. 从工具栏菜单中选择你要进行检测的app。
  3. 点击Record按钮。
  4. 执行你要检查的代码的操做,当有内存泄露的时候点击Stop按钮。
  5. 在Detail窗口中点击被标记为泄露的内存。
  6. 在Extended Detail 窗口,在代码中双击选中其中的一条指令。
  7. 在Detai窗口中点击Xcode图标,能够在Xcode中打开你要查看的代码。


    注意:若是泄露的不是一个对象,那么多是你的API调用的时候分配了一块内存可是忘记了去释放。 开发工具

    若是泄露的内存是一个Object-C对象,点击选中的对象旁边的箭头,每一个单独的地址将会显示每一个对象retain/release的历史记录,对每个事件都有堆栈跟踪。 测试

    引发非对象内存泄露的缘由是内存的分配和释放没有保持一致,所以只能显示每一个事件的堆栈跟踪。 spa

    跟踪视图的内存泄露集合了全部的内存泄露块的位置——代码中的一个错误可能致使重复执行的这段的代码的调用产生多个运行时的内存泄露。 设计

    打 开Xcode查看每一个每个产生内存泄露的代码时,内存泄露尚未被清除。Leaks工具的Detail窗口中的Cycles&Roots容许你 去查看调用循环。用ARC的时候Cycles&Roots视图是很是重要的。它能够用更高级的视图方式显示循环引用。一般的解决这些问题的关键是 就是把引用改成弱引用。 code

    查看循环引用内存泄露

    1. 选择Leaks
    2. 在Detail面板中选择Cycles&Roots视图。
    3. 选择内存泄露的循环引用表。


    注意:若是另外一部分代码依然依赖这个消除的Bug或者这个Bug没有修改正确,那么你的App依然不稳定。 对象

有两种方式能够运行Allocations And Leaks(同Time Profiler打开方式类似)。

1、在Xcode中的Debug中打开(第一种方式)

1)运行程序后,进入Show the Debugger navigation(红色线框区域)界面。

          选中Memory(蓝色线框区域) 事件

        @1.Memory Use:            彩虹圈的8G是本机的内存,其中18.7M为IOS Simulator所占用的内存(这里的占用数据只能做为参考,实际真机占用内存可能会比这个数据要小)。

        @2.Usage Comparison : 这里是本机内存的使用状况,其实TestForApp为IOS Simulator所占内存。

         @3.Memory:

                                                   Duration:为IOS Simulator 运行app的实际时间;

                                                   High:    使用内存最多时的内存数量;

                                                   Low:      使用内存最低时的内存数量;

 

2) 点击右上角Profile in Instruments,进入Instruments界面。

 

         这里会弹出一个对话框。

        @1Restart: (从新运行项目)

        @2Transfer:(将当前运行项目直接放入Instruments进行分析)

3) 点击Restart,进入分析界面。点击运行按钮,运行 一段时间后,有以下界面。

 

           @1.Allocations:    分配的内存(被选中,区域3显示即为Allocations)

           @2.Leaks:         有内存泄露的内存

           @3.Details:        具体的分配和泄露内存的分析(选择Call Tree选项能够查看)

           @4.Settings:      详细的设置(选择Allocations 和 Leaks设置选项不一样) ,如下为Allocations的Settings

                                        Allocations Lifespan:    Allocations                          (全部分配的内存)

                                                                               Created & Persistent           (仍存在的) 

                                                                               Created & Destroyed           (销毁的)

                                        Allocations Type:         All Heap & Anonymous  VM(堆内存和虚拟机上分配的内存)

                                                                               All Heap Allocations            (堆内存)

                                                                               All VM Regions                     (虚拟机上分配的内存)

4)右键点击Leaks区域,选择Call Tree 查看(Leaks 中红色部分即为内存泄露)

      

         双击main函数

 

              @1:红色区域有内存泄露55.33KB

              @2:  绿色区域直接将arrString = nil; 项目没有使用ARC,arrString alloc后没有release,形成内存泄露。

5)修改项目后从新编译,再次进入分析界面

 

            @1:  红色区域修改代码,从新编译;

            @2:  成功运行App后再也不有内存泄露。

6)查看Allocations

 

         @1:选中Allocations

         @2:选中2中的Call Tree,查看分配的内存详情。

         查看Allocations方式与查看Leaks的方式基本相同

7)退出保存

           @1:点击退出键,若是有运行过的项目,则会弹出保存对话框;没有运行过项目则直接退出

           @2 :  保存选项

 

2、从Instruments中打开Allocations and Leaks

1)打开Xcode开发工具

           @1: 打开Xcode->Open Develop Tool ->Instruments

2)显示以下界面

          @1:下拉能够选择全部的Instruments。

3)下拉选择Leaks

           @1: 双击Leaks,显示以下界面

 

4)其他步骤跳参考: 1、3)

相关文章
相关标签/搜索