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. OpenCV学习(38) 人脸识别(3)

                前面我们学习了基于特征脸的人脸识别,现在我们学习一下基于Fisher脸的人脸识别,Fisher人脸识别基于LDA(线性判别算法)算法,算法的详细介绍可以参考下面两篇教程内容: ...

  2. C++ string 字符串查找匹配

    在写C++程序中,总会遇到要从一个字符串中查找一小段子字符串的情况,对于在C中,我们经常用到strstr()或者strchr()这两种方法.而对于C++的string,我们往往会用到find(). C ...

  3. iOS开发-UI基础Demo

    现在更多的学习资料都是xCode4.X的,发现xCode6.1还是很多东西,如果有正在学习iOS开发的可以通过Demo简单了解下iOS的UI开发~ 1.新建单视图文件: 2.新建项目名称,语言选择OC ...

  4. JS 和 HTML 中的单引号与双引号

    JS中的单引号与双引号 HTML中的单引号与双引号很简单,就是两个字符实体: 显示 描述 实体名称 实体编号 " 双引号.引号 " " ' 单引号.撇号 &apo ...

  5. 【翻译自mos文章】CRS显示 正在执行的db instance 是offline状态

    CRS显示 正在执行的db instance 是offline状态 转自: CRS shows Running Instance Status as OFFLINE (Doc ID 1673397.1 ...

  6. GO语言基础语法

    1. Go项目的目录结构 一般的,一个Go项目在GOPATH下,会有如下三个目录: project   --- bin   --- pkg   --- src 其中,bin 存放编译后的可执行文件:p ...

  7. Android -- SlidingMenu

    实现原理 在一个Activity的布局中需要有两部分,一个是菜单(menu)的布局,一个是内容(content)的布局.两个布局横向排列,菜单布局在左,内容布局在右.初始化的时候将菜单布局向左偏移,以 ...

  8. idea 本地调用zookeeper配置

  9. 装上了Fedora19

    超期服役的Aspire黑机器在一个下午主动退役了,为了填补它留下的空白,趁JD减价入手了一台宏碁(acer) SQX4610 120N,就为了玩Linux. 这机器用光驱启动有些特殊,需要在启动时不断 ...

  10. HTTP请求格式和HTTP响应格式

    主要内容: 1.HTTP请求格式 2.HTTP响应格式 一.HTTP请求格式 当浏览器向Web服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息,HTTP请求信息由3部分组成:l   请求方 ...