使用静态分析器:【Static Analyzer】
检测可疑的代码并提出警告,指出可能会在运行时出现问题的代码。静态分析器【static analyzer】是一个不需要运行程序就可以从逻辑上检测代码的工具,它可以寻找会演变bug的错误。
1.1静态工作
它不是简单地浏览一遍源代码,而是在应用程序的代码通道中查找逻辑错误并反馈给你。你可以在构建并运行之前就对它们进行修复。
静态分析器可以认出以下几种错误:
?1、安全问题,比如内存泄漏和缓冲区溢出。
?2、并发性问题,比如静态条件(也就是依赖时间的两个或多个任务失效)。
?3、逻辑问题,包括废代码和不好的编码习惯。
不足之处:
?1、因为需要消耗时间来进行分析,所以会拖慢构建程序的过程。
?2、有时会误报错误。
?3、改变了你熟悉的工作流程,因为你必须要适应它。
1.1.1:开始分析
点击Product->Analyze,也可以使用Command + Shift + B
1.废代码
第一个问题是“无效变量”。它指的是我们创建了一个对象,但从来没有在代码中直接访问过,没有向它发送消息也没有更改过它。
2.无懈可击的Garage
某个对象有内存泄漏的潜在危险,特别是Garge对象,我们在main函数末尾释放pool变量之前就释放了garage对象
3.释放之前创建的对象:
carsCopy的内存泄漏问题。我们为变量cars创建了一个可变的字典副本carsCopy,但是没有释放副本,可以通过在main函数结尾处释放carsCopy来修复这个问题。
4.返回前记得释放:
在AllweatherRadial类中有内存泄漏。Description中分配了一个字符串desc,但并没有在返回函数之前释放它。应改为return [desc autorelease].
1.1.2:协助分析器
在方法中使用关键字以避免误报。
1.返回一个保留的对象:
可以使用NS_RETURNS_RETAINED来标记一个方法,以返回一个保留计数器的值不是0的对象。
- (NSMutableArray *)superDuperArrayCreator NS_RETURNS_RETAINED; - (NSMutableArray *)superDuperArrayCreator { NSMutableArray * myArray = [[NSMutableArray alloc] init]; //process the myArray return myArray; }
2.返回一个未保留的对象:
- (NSMutableArray *)superDuperArrayCreator NS_RETURNS_NOT_RETAINED;或C的对象CF_RETURNS_NOT_RETAINED
分析器便会在我们返回一个保留对象时提出问题。
3.不返回对象
使用关键字CLANG_ANALYZER_NOTRETURN。如果你试图返回一个值,就会出现一个分析器问题。
1.1.3:了解更多【可以找到的其他错误】
1.等号错误
:条件语句判断 if (myValue= [self getValue]){//do somthing}.理解If语句?1.为myValue赋一个值并判断它是否为nil?2.myValue等于那个方法的返回值。
2.内存泄漏
- (void)myMethod{ NSString * string = [[NSString alloc] initWithFormat:@"%d,%d",1,2]; if (nil==string) { return; } NSArray * array = [NSArray arrayWithObjects:string, nil]; if (nil==array) { return; } [array release]; [string release]; }
为array分配内存失败,方法便不能运行,并会立即返回出来,但在这时,我们已经分配了string 字符串,因为我们根本没有执行后面的release代码,所以它还没有被释放。【无论在什么时候退出了方法,都需要想想有没有分配了还没有释放的对象】。
3.过度释放
NSString * myString = [[[NSString alloc] initWithFormat:@"23"] autorelease]; //later that same app [myString autorelease];
移除autorelease
4.@synchronize语句中的空值
假设我们需要修改一个对象,但想确保在修改它的时候没有其他对象访问它。我们知道可以使用@synchronized(object),这样修改完之后,它就可以有效访问了。
不过。如果对象是nil(空值),静态分析器将会发出警告,并且@synchronize语句将没有任何效果。为了修复这个问题,我们必须确保对象不是nil.
5.静态分析器的评价
在代码中报告潜在的问题,而且很善于释放语句。