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. Xcode执行Analyze静态分析

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

  2. iOS逆向工程-静态分析

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

  3. iOS实录15:浅谈iOS Crash

    导语:在当前的iOS开发中,虽然ARC为开发者解决了手动内存管理时代 的许多麻烦,但是内存方面的问题依然是产生iOS Crash的元凶之一,本文介绍内存方面,有关僵尸对象.野指针.内存泄漏.废弃内存这 ...

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

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

  5. IOS 如何排除闪退和内存泄漏问题

    下面来总结一下我是怎样排除闪退问题的. 1-在哪里闪退 首先了解在哪个界面发生了闪退,然后真机测试或者模拟器测试找到对应的界面进行测试! 1.1-闪退能重现则分以下几种情况 1.1.1-数据问题 数据 ...

  6. iOS内存泄露监测和修复

    内存泄露的相关概念: 如果程序运行时一直分配内存而不及时释放无用的内存,程序占用的内存越来越大,直到把系统分配给该APP的内存消耗殚尽,程序因无内存可用导致崩溃,这样的情况我们称之为内存泄漏. 内存泄 ...

  7. IOS 开发高手课 学习笔记(第一部分)

    年前购买了三门课程,Android 开发高手课.IOS开发高手课与从0开始学架构,利用工作的空余时间匆匆忙忙的,快6个月了,终于把前两门课程都过了一遍,也把其中一些遗漏的知识补充了,可以开始看第二遍, ...

  8. 【iOS沉思录】BAD_ACCESS内存错误调试

    BAD_ACCESS 在什么情况下出现 BAD_ACCESS 报错属于内存访问错误,会导致程序崩溃,错误的原因是访问了野指针(悬挂指针).野指针指的是本来指针指向的对象已经释放了,但指向该对象的指针没 ...

  9. Instruments的一点使用心得

    [一]应用性能分析报表: 1.cpu使用率 真机调试时,查看运行状态标签,CPU一栏:最高使用,最低使用,平均使用 Instruments--timerProfile :CPU使用率详情 2.线程状态 ...

  10. 知识点归档,博客记录

    由于本人能力有限,难免有错,欢迎批评.指正.补充,目录请看右下角 Foundation复习 利用category + runtime + 异常的捕获 来写一个防止崩溃的框架 扩展(Extension) ...

最新文章

  1. Execution failed for task ':app:mergeDebugResources'.
  2. 面试彩蛋1:斐波那契数列用递归函数、循环函数实现
  3. 中国计算机专业专科学校排名2015,计算机专科学校排名前十(最出名的10所计算机学院)...
  4. 【控制】《复杂运动体系统的分布式协同控制与优化》-方浩老师-第5章-多欧拉-拉格朗日系统分布式编队跟踪控制
  5. MySQL 建表字段长度的限制问题
  6. struct结构体初始化3种方法
  7. word vba 读出光标所在的列数_word高效技巧:这几个表格操作让工作更快速
  8. flex布局导致拉伸的问题
  9. 从代码到300优质客户,用户画像在销售的实战应用
  10. 一步步打造一个移动端手势库
  11. 三级数据库技术思维导图
  12. Iperf下载及使用说明
  13. 二元函数偏导数公式_二阶偏导数公式详解
  14. 学生用计算机的使用技巧,选学生笔记本电脑的小窍门
  15. 尚学堂学习周期及相关视频简介
  16. 套利[题目][j2]
  17. 安卓移动开发实验:Android Studio设计微信界面
  18. 学习USART自闭实录(stm32F411RE)Stm32cubemx
  19. 果园篱笆c语言算法,凸包问题(果园篱笆)
  20. tuxedo错误码6_tuxedo错误解析和常用配置说明

热门文章

  1. GridViewObjectDataSource新特性小记 懒人篇(一) 分页上路
  2. leetCode----day01---- 从排序数组中删除重复项
  3. 用css实现图片翻转
  4. pylot网站压力测试
  5. nodejs gulp less编辑
  6. 05.javascript访问CSS
  7. DropDownList 实现分页不包含选择值
  8. PHP switch问题
  9. 19/03/17Python笔记
  10. 开发API整理(转)