iOS性能优化之静态分析器

iOS性能优化之静态分析器iOS性能优化之静态分析器

iOS性能优化之静态分析器

iOS性能优化之静态分析器

使用静态分析器:【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.静态分析器的评价 

在代码中报告潜在的问题,而且很善于释放语句。

  

 

 

 

 

 

 

 

 

iOS性能优化之静态分析器

上一篇:Android官方开发文档Training系列课程中文版:目录


下一篇:安卓交叉编译环境配置