1、Analyze

  • 使用 Xcode 自带的静态分析工具 Product -> Analyze(快捷键 command + shift + B)可以找出代码潜在错误,如内存泄露,未使用函数和变量等。

  • Analyze 主要分析以下四种问题:

    • 1、逻辑错误:访问空指针或未初始化的变量等;
    • 2、内存管理错误:如内存泄漏等,比如 ARC 下,内存管理不包括 core foundation;
    • 3、声明错误:从未使用过的变量;
    • 4、Api 调用错误:未包含使用的库和框架。
  • 官方文档 Xcode 执行静态代码分析视频教程

2、分析结果处理

  • 1、user-facing text should use localized string macro

    • 面向用户的文本应该使用本地化的字符串宏。此为代码中配置了本地化,面向用户的应该用字符串宏,而我们直接赋值为汉字,因此此提示可以忽略。
  • 2、instance variable used while 'self' is not set to the result of '[(super or self) init...]

    	// 此方法提示错误
    - (instancetype)initWithType:(FTFFavorateType)type { if (self == [super init]) {
    _type = type;
    }
    return self;
    }
    • 修改为如下

      	- (instancetype)initWithType:(FTFFavorateType)type {
      
      	    if (self = [super init]) {
      _type = type;
      }
      return self;
      }
  • 3、Value stored to ‘durationValue’ during its initialization is never read

    • 在初始化过程中存储的 “持续时间值” 的值永远不会被读取

      	// 此段代码提示错误
      NSMutableArray *datesArray = [[NSMutableArray alloc] init];
      datesArray = [_onDemandDictionary objectForKey:key];
    • 这是因为 [NSMutableArray alloc] init] 初始化分配了内存,而判断语句里面 [_onDemandDictionary objectForKey:key] 方法也相当于初始化分配了内存,就是把初始化的一个新的可变数组赋值给之前已经初始化过的可变数组,看似没什么大问题,其实存在一个数据源却申请了两块内存的问题,已经造成了内存泄露。

    • 修改为如下

      	NSMutableArray *datesArray = nil;
      datesArray = [_onDemandDictionary objectForKey:key];
  • 4、Potential leak of an object stored into 'imageRef'

    • imageRef 对象有内存泄漏

      	+ (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;
      }
  • 5、Analyze 逻辑错误监测

    • 这种情况在 codereview 时也较难发现,可以借助 Analyze。
    • 如上代码,当 Tag 不等于 1、2 和 3 的时候,就会出现很问题了。
    • Analyze 还给出了箭头提示:len is a garbage value。建议在声明变量时,同时进行初始化。

3、内存分析

3.1 静态内存分析

  • 所谓静态内存分析,是指在程序没运行的时候,通过 Xcode 自带的静态分析工具 Product -> Analyze(快捷键 command + shift + B)对代码直接进行分析。根据代码的上下文的语法结构,让编译器分析内存情况,检查是否有内存泄露。

  • 缺点:静态内存分析由于是编译器根据代码进行的判断, 做出的判断不一定会准确, 因此如果遇到提示, 应该去结合代码上文检查一下。

  • 内存泄漏提示:Potential leak of an object stored into 'imageRef'

    • imageRef 对象有内存泄漏

      	+ (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;
      }

3.2 动态内存分析

  • 动态内存分析通过 Xcode 自带的动态分析工具 Xcode -> Product -> Profile(Leaks 工具)动态的对内存进行分析,大多时候只是堆内存的分析。

3.3 动态加载图片的内存分析

  • imageNamed 和 imageWithContentOfFile 方法的比较。

  • 1、imageName 加载图片

    • a、当 imageview 对象销毁时候,图片对象不会随着一起销毁。

    • b、加载的图片占据的内存比较大。

    • c、相同的图片只会加载一份到内存中,如果同时使用,使用的是同一个图片对象。

  • 2、imageWithContentOfFile 加载图片

    • a、当 imageView 对象销毁的时候,图片对象会随着一起销毁。

    • b、加载的图片占用的内存比较小。

    • c、相同的图片对象会多次加载到内存中,如果同时使用图片,使用的是不同的对象。

  • 总结

    • imageName:如果一些图片在多个界面都会使用,并且图片较小,使用频率高,(图标/小的背景图)。

    • imageWithContentOfFile:只在一个地方使用,并且图片比较大,使用频率不高,(相册/版本新特性)。

iOS - Analyze 静态分析的更多相关文章

  1. IOS性能调优系列:Analyze静态分析

    目前关于IOS性能优化的教程较少,决定写一个<IOS性能调优系列>,主要关注与内存泄漏.性能优化.流量和电量分析几个方面. XCode已经提供了非常强大的性能调优工具,结合几个第三方工具和 ...

  2. Analyze 静态分析工具中显示 大量的CF类型指针 内存leak 问题, Core Foundation 类型指针内存泄漏

    Analyze 静态分析工具中显示 大量的CF类型指针 内存leak 问题   今天使用Analyze 看了下项目,   解决办法,项目中使用了ARC,OC的指针类型我们完全不考虑release的问题 ...

  3. iOS性能调优之Analyze静态分析

    之前遇到一个同事写的 陈年老工程,需要尽快的时间修改里面的东西,急用,让我帮忙.那就帮着看看. 而Analyze这个工具 真是好用. 工程存在严重的内存泄漏.  如果不解决  很容易就会出现崩溃等现象 ...

  4. ios逆向工程-静态分析

    最近在学习IOS逆向工程,查看网络上的资料也不是太多,边学边总结一下. 首先学习资料: 念茜(大神)的博客: http://nianxi.net <ios应用逆向工程 分析与实战> --- ...

  5. iOS静态分析举例

    XCode-> Product -> Analyze 即可进行iOS静态代码分析.静态分析能发现的问题包括以下几种类型: 1.逻辑错误:访问空指针或未初始化的变量等: 2.内存管理错误:如 ...

  6. iOS性能优化之内存管理:Analyze、Leaks、Allocations的使用和案例代码

    最近接了个小任务,和公司的iOS小伙伴们分享下instruments的具体使用,于是有了这篇博客...性能优化是一个很大的话题,这里讨论的主要是内存泄露部分. 一. 一些相关概念 很多人应该比较了解这 ...

  7. IOS性能调优系列:使用Instruments动态分析内存泄漏

    硬广:<IOS性能调优系列>第二篇,持续更新,欢迎关注. 第一篇介绍了Analyze对App做静态分析,可以发现应用中的内存泄漏问题,对于有些内存泄漏情况通过静态分析无法解决的,可以通过动 ...

  8. iOS性能调优系列(全)

    总结: 三类工具 基础工具 (NSLog的方式记录运行时间.) 性能工具.检测各个部分的性能表现,找出性能瓶颈 内存工具.检查内存正确性和内存使用效率 性能工具: 可以衡量CPU的使用,时间的消耗,电 ...

  9. IOS性能调优系列:使用Zombies动态分析内存中的僵尸对象

    硬广:<IOS性能调优系列>第四篇,预计会有二十多篇,持续更新,欢迎关注. 前两篇<IOS性能调优系列:Analyze静态分析>.<IOS性能调优系列:使用Instrum ...

随机推荐

  1. 深入理解Java中的组合和继承

    Java是一个面向对象的语言.每一个学习过Java的人都知道,封装.继承.多态是面向对象的三个特征.每个人在刚刚学习继承的时候都会或多或少的有这样一个印象:继承可以帮助我实现类的复用.所以,很多开发人 ...

  2. Linq编程小趣味爱因斯坦谜题

    最近看到一个比较老的题目,题目----在一条街上,有5座房子,喷了5种颜色,每个房里住着不同国籍的人,每个人喝不同的饮料,抽不同品牌的香烟,养不同的宠物,问题---谁养鱼? 以前没事还做过这个题,现在 ...

  3. RxJava 设计理念 观察者模式 Observable lambdas MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  4. 分布式唯一ID极简教程

    原创 2017-11-21 帝都羊 架构师小秘圈 一,题记 所有的业务系统,都有生成ID的需求,如订单id,商品id,文章ID等.这个ID会是数据库中的唯一主键,在它上面会建立聚集索引! ID生成的核 ...

  5. SQL语句大小写是否区分的问题,批量修改整个数据库所有表所有字段大小写

    一.实例介绍 SQL语句大小写到底是否区分呢?我们先从下面的这个例子来看一下: 例: --> 创建表,插入数据: declare @maco table (number int,myvalue ...

  6. jquery选择器用法笔记(第一部分)

    由于我在项目中用jquery比较多,而且觉得jquery真的很不错,尤其是其灵活高效的选择器更是令人无法忘怀.那么,今天就来写一篇非常基础的关于jquery选择器的文章,路过的朋友可以收藏以作参考. ...

  7. 【Hadoop】mapreduce采用多进程与spark采用多线程比较

    转自:Mapreduce多进程与spark多线程 Apache Spark的高性能一定程度上取决于它采用的异步并发模型(这里指server/driver 端采用的模型),这与Hadoop 2.0(包括 ...

  8. OpenSSL 中 RSA 加密解密实现源代码分析

    1.RSA 公钥和私钥的组成.以及加密和解密的公式: 2.模指数运算: 先做指数运算,再做模运算.如 5^3 mod 7 = 125 mod 7 = 6 3.RSA加密算法流程: 选择一对不同的.而且 ...

  9. selenium 加载jquery

    packagecom.example.tests; import staticorg.junit.Assert.*; importjava.util.*; importorg.junit.*; imp ...

  10. java正则表达式简介

    Java的正则表达式讲解:(为了能看清,本文正则表达式用中文的句号代替英文句点) 1 英文句点符号:匹配单个任意字符. eg: 表达式”t.o  可以匹配:tno,t#o,teo等等.不可以匹配:tn ...