• 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.静态分析器的评价 

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

      

     

     

     

     

     

     

     

     

  • 相关阅读:
    160-三个用户同时登录,是怎么实现多线程的?
    159-如何解决缓存穿透?
    158-为什么会引发缓存穿透?
    存储emoji表情,修改字符集为utf8mb4
    java相差小时数
    pom.xml解释
    前端 跨域
    java 获取的是本地的IP地址
    是否超时
    发送验证码
  • 原文地址:https://www.cnblogs.com/StevenHuSir/p/StaticAnalyzer.html
Copyright © 2020-2023  润新知