iOS - Analyze 静态分析

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

1、Analyze

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

    Analyze3

  • 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 逻辑错误监测

    Analyze1

    • 这种情况在 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 工具)动态的对内存进行分析,大多时候只是堆内存的分析。

    Analyze2

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

  • imageNamed 和 imageWithContentOfFile 方法的比较。

  • 1、imageName 加载图片

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

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

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

  • 2、imageWithContentOfFile 加载图片

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

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

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

  • 总结

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

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

目录
相关文章
|
6天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
1月前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
114 1
|
1月前
|
设计模式 安全 Swift
探索iOS开发:打造你的第一个天气应用
【9月更文挑战第36天】在这篇文章中,我们将一起踏上iOS开发的旅程,从零开始构建一个简单的天气应用。文章将通过通俗易懂的语言,引导你理解iOS开发的基本概念,掌握Swift语言的核心语法,并逐步实现一个具有实际功能的天气应用。我们将遵循“学中做,做中学”的原则,让理论知识和实践操作紧密结合,确保学习过程既高效又有趣。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你打开一扇通往iOS开发世界的大门。
|
1月前
|
搜索推荐 IDE API
打造个性化天气应用:iOS开发之旅
【9月更文挑战第35天】在这篇文章中,我们将一起踏上iOS开发的旅程,通过创建一个个性化的天气应用来探索Swift编程语言的魅力和iOS平台的强大功能。无论你是编程新手还是希望扩展你的技能集,这个项目都将为你提供实战经验,帮助你理解从构思到实现一个应用的全过程。让我们开始吧,构建你自己的天气应用,探索更多可能!
66 1
|
13天前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
34 9
|
9天前
|
设计模式 Swift iOS开发
探索iOS开发:从基础到高级,打造你的第一款App
【10月更文挑战第40天】在这个数字时代,掌握移动应用开发已成为许多技术爱好者的梦想。本文将带你走进iOS开发的世界,从最基础的概念出发,逐步深入到高级功能实现,最终指导你完成自己的第一款App。无论你是编程新手还是有志于扩展技能的开发者,这篇文章都将为你提供一条清晰的学习路径。让我们一起开始这段旅程吧!
|
13天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
11天前
|
iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第39天】在苹果的生态系统中,SwiftUI框架以其声明式语法和易用性成为开发者的新宠。本文将深入SwiftUI的核心概念,通过实际案例展示如何利用这一框架快速构建用户界面,并探讨其对iOS应用开发流程的影响。
|
14天前
|
JSON 前端开发 API
探索iOS开发之旅:打造你的第一个天气应用
【10月更文挑战第36天】在这篇文章中,我们将踏上一段激动人心的旅程,一起构建属于我们自己的iOS天气应用。通过这个实战项目,你将学习到如何从零开始搭建一个iOS应用,掌握基本的用户界面设计、网络请求处理以及数据解析等核心技能。无论你是编程新手还是希望扩展你的iOS开发技能,这个项目都将为你提供宝贵的实践经验。准备好了吗?让我们开始吧!