iOS调试 - instruments

作者: Stago | 来源:发表于2017-03-10 13:52 被阅读295次

    instrument里面包含了很多工具,内存溢出分析,性能分析,各种分析…… 这里就不细说了.
    主要看看专用debug的内存溢出分析工具的使用


    Analyze静态分析

    相信IOS开发者在App进行Build或Archive时,会产生很多编译警告,这些警告是编译时产生的,静态分析的过程也类似,在XCode Product菜单下,点击Analyze对App进行静态分析。
    Analyze主要分析以下四种问题:

    逻辑错误:访问空指针或未初始化的变量等;
    内存管理错误:如内存泄漏等;
    声明错误:从未使用过的变量;
    Api调用错误:未包含使用的库和框架。

    <li>Analyze内存泄漏分析</li>

    声明错误、逻辑错误、Api调用错误基本在编译时都会有警告,Analyze的主要优势在于静态分析内存泄漏及代码逻辑错误。
    比如在开启arc的环境下,输入以下一段代码:

    //截取部分图像
    +(UIImage*)getSubImage:(unsigned long)ulUserHeader
    {
        UIImage * sourceImage = [UIImage imageNamed:@"header.png"];
        CGFloat height = sourceImage.size.height;
        CGRect rect = CGRectMake(0 + ulUserHeader*height, 0, height, height);
    
        CGImageRef imageRef = CGImageCreateWithImageInRect([sourceImage CGImage], rect);
        UIImage* smallImage = [UIImage imageWithCGImage:imageRef];
        //CGImageRelease(imageRef);
    
        return smallImage;
    }
    

    用注释注释掉CGImageRelease(imageRef)这行,虽然开起了arc,不过仍然会导致imageRef对象泄漏。

    使用Analyze进行分析,在导航栏Analyze选择Analyzer查看分析结果:


    Analyze已经分析出imageRef对象有内存泄漏,这种情况在编译时是无法发现的。
    如果你没有使用ARC,那么Analyze更有用。
    Analyze的其他三种分析也可以使用,相比编译器给出的信息更明确。

    <li>Analyze逻辑错误监测</li>

    这种情况在codereview时也较难发现,可以借助Analyze。
    如上代码,当Tag不等于1、2和3的时候,就会出现很问题了。
    Analyze还给出了箭头提示:len is a garbage value。建议在声明变量时,同时进行初始化。

    leaks工具

    点击Product->Profile,然后选择那个漏水的水管Leaks,进入界面后,点击运行,instruments就会开始自动检测内存泄露的地方了,在这个过程中,可以对手机上运行的测试工程进行操作,图形界面中,上面是Allocations,下面是Leaks,当出现了一条红色的小柱子的时候,就是出现了内存泄露;点击界面中间分隔条,选择Call Tree选项,然后把右边的 “Invert Call Tree” 和 “Hide System Libraries”选项,就可以看到具体是那个类中得哪个方法出现了内存泄露了,双击类名,就出显示出此类此方法中造成的内存泄露代码,ok,接下来就是有针对性的进行代码优化,内存优化了。
    由于现在用得都是ARC模式,所以一般出现泄露的地方都是block中的self疏忽了,没有使用weak类型;或者,两个类之间出现了循环应用这种低级错误引起的。

    打开Xcode自带的Instruments:



    或者:


    选择Leaks选项


    下面我们进入正式的测试。
    1.选中Xcode先把程序(command + R)运行起来。
    2.再选中Xcode,按快捷键(command + control + i)运行起来,此时Leaks已经跑起来了。
    3.由于Leaks是动态监测,所以我们需要手动操作APP,一边操作,一边观察Leaks的变化,当出现红色叉时,就监测到了内存泄露,点击右上角的第二个,进行暂停检测(也可继续检测,当多个时暂停,一次处理了多个).如图所示:

    4.下面就是定位修改了,此时选中有红色柱子的Leaks,下面有个"田"字方格,点开,选中Call Tree,显示如下图界面:


    5.下面就是最关键的一步,在这个界面的右下角有若干选框,选中Invert Call Tree 和Hide System Libraries,(红圈范围内)显示如下:


    到这里就算基本完成啦,这里显示的就是内存泄露代码部分,那么现在还差一步:定位!

    6.选中显示的若干条中的一条,双击,会自动跳到内存泄露代码处,如图所示


    7.最后一步,就是根据内存泄露的提示修改代码了!

    相关文章

      网友评论

        本文标题:iOS调试 - instruments

        本文链接:https://www.haomeiwen.com/subject/fewngttx.html