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.最后一步,就是根据内存泄露的提示修改代码了!
网友评论