Instruments可以在应用运行时发现问题,而Xcode的静态分析器不用运行应用就可以分析(analyze)代码。静态分析器可以根据预置的经验数据猜测执行代码后可能发生的状况,并报告潜在的问题。
当检查代码时,静态分析器会枚举每条可能的代码路径(code path),并分开检查所有的函数和方法。一段代码可以有很多控制语句(if、for、switch等),这些语句的输入条件决定应用会执行哪部分的代码。代码路径是指在控制语句的作用下,代码可能执行的流程。例如,拥有一条if语句的方法就有两条代码路径:条件失败是一条,条件成功是另一条。
目前静态分析器检测TouchTracker时不会报告任何问题。下面在BNRDrawView.m中加入一段有问题的代码:
- (int)numberOfLines
{
int count;
// 计数前先查看相应的指针是否为nil
if (self.linesInProgress && self.finishedLines)
count = [self.linesInProgress count] + [self.finishedLines count];
return count;
}
运行静态分析器的方法和分析应用相同:按住工作空间左上角的Run按钮不放,这次在弹出窗口中选择Analyze。此外,也可以使用键盘快捷键Command-Shift-B运行静态分析器。
Xcode会在问题面板中显示分析结果。分析TouchTracker后,静态分析器会报告在numberOfLines方法的返回点报告一处逻辑错误(Logic error)。静态分析器认为numberOfLines方法中的某条代码路径会导致该方法返回未定义的值或垃圾值。也就是说,该方法可能会返回尚未赋值的count(见图14-18)。
图14-18 静态分析结果
静态分析器还可以显示出上述结果的分析过程。单击位于分析结果左侧的小三角按钮,展开详细信息。单击位于小三角按钮下方的条目,Xcode会在编辑器区域显示对应的代码。此外,Xcode还会用箭头指明产生问题的那条代码路径(见图14-19)。如果Xcode没有在代码左侧的空白区域显示行号,可以通过以下途径打开相应的设置:打开预置窗口(选择Xcode菜单中的Preferences菜单项),选中Text Editing标签并勾上Show Line Numbers(显示行号)。
图14-19 展开后的分析结果
针对上述逻辑错误,静态分析器显示的代码路径如下。
(1)定义了count变量但是没有为其赋值。
(2)if语句的条件判断失败,导致count没有得到赋值。
(3)numberOfLines方法没有为count赋值就返回了该变量。
要解决上述问题,可以在定义count时就将其赋为0。
- (int)numberOfLines
{
int count;
int count = 0;
// 计数前先查看相应的指针是否为nil
if (linesInProcess && completeLines)
count = [linesInProcess count] + [completeLines count];
return count;
}
再使用静态分析器分析TouchTracker,Xcode应该不会再报告任何问题。
静态分析器能够找出多种类型的问题(经常分析代码是个好习惯)。读者不应该回避静态分析器报告的错误提示。相反,花些时间展开分析报告并弄清楚具体的原因,会对应用的开发及提高读者的编程能力有帮助。