iOS:内存优化思路
前言:ARC
内存管理需要说说ARC:
ARC
(Automatic Reference Counting):自动引用计数内存管理。ARC是一种编译器功能,它通过LLVM编译器和Runtime协作来进行自动管理内存。
ARC
如何进行自动管理内存?
LLVM编译器会在编译时
在合适的地方为 OC 对象插入retain
、release
和autorelease
代码来自动管理对象的内存。
计算机语言分为:编译型语言、直译式语言(脚本语言)
语言 | 编译形式 | 效率 | 调试 | |
---|---|---|---|---|
编译型语言 | C++ Objective C Swift Kotlin |
先通过编译器生成机器码 机器码可以直接在 CPU 上执行 |
执行效率较高 | 调试周期长 |
直译式语言 | JavaScript Python |
不需要经过编译,在执行时 通过一个中间的解释器将代码解释为 CPU 可以执行的代码 |
执行效率低 | 编写调试方便 |
编译又分为前端编译和后端编译
1:前端编译
前端编译:主要是通过前端编译器Clang
,生成中间码。Clang
主要处理:
- 预处理: 主要是
宏替换
(把宏嵌入到对应的位置),头文件的导入
、注释删除
- 词法分析: 这里把源文件中的代码转化为特殊的
标记流
,源码被分割成一个一个的字符和单词,在行尾Loc中都标记出了源码所在的对应源文件和具体行数,方便在报错时定位问题。 - 语法分析: 这一步是把词法分析生成的
标记流
,解析成一个抽象语法树,同样地,在这里面每一节点也都标记了其在源码中的位置。 - 静态分析:分析代码是否存在问题,给出错误信息和修复方案:如出现方法被调用但是未定义、定义但是未使用的变量等
- 前面的过程完了,就会生成中间代码(bitCode) IR:并会对bitcode进行各种类型的优化,将bitcode代码进行一些逻辑等价的转换,使得代码的执行效率更高,体积更小
2:后端编译
后端编译:主要由后端编译器LLVM,把优化后的中间码bitcode
编译为指定目标架构的机器码,比如X86Backend负责把bitcode编译为x86指令集的机器码
在 iOS 编译中,编译器后端其实就是 LLVM 自己提供的一套后端。它包含了 机器码生成器、链接器等工具,会对 IR
进行机器无关的代码优化,生成机器语言。
二、内存优化思路
当内存使用过高,可能就会发生OOM(Out-Of-Memory)。所以内存使用过高,系统就会回收一些内存:
先回收优先级极低的进程和一些正常情况下随时可回收的进程。
如果还有内存压力,就会杀掉后台进程以及一些后台执行的任务
最终还有内存压力,就会发生OOM
内存问题主要包括两个部分
- 常见循环引用导致的内存泄露
- 大量数据加载及使用导致的内存警告
内存优化也是注意处理这两个部分
1、循环引用
循环引用对App有潜在的危害,会使内存消耗过高,性能变差和Crash等,主要从以下几个方面入手
- Delegate
代理要声明为weak,不能用strong。 - NSTimer
RunLoop会强引用target,可以使用weakProxy 消息转发。使用GCD timer - Block
_weak 修饰对象 - C语法,malloc之后调用free
二、大量数据加载导致内存暴涨
在一些使用场景里,比如整个页面初始化,要分配整个使用内存,批量的图片处理,会出现一段时间内需要加载大量内容,占用过高的内存。而iOS的低内存机制就是给你一个阈值,只要你的APP超过这个数值,哪怕只是一瞬间也会直接崩溃。因此我们就需要对这种瞬间的高增幅去进行优化。我们就需要用时间去换空间,拉长整个加载步骤。
- 懒加载:时间去换空间
- 单次出现的图片使用
imageWithContentsOfFile
加载 - 在循环里面使用autoreleasepool,让临时对象及时释放
- 图片内存使用优化:使用适当尺寸的图片、及时回收图片、注意图片缩放方式
a:使用适当尺寸的图片
解压后的图片是由一个个像素点组成的。每个像素点一般有R、G、B、A(红绿蓝透明度)四个通道,每个通道是8位,因此一个像素通常占用4字节。对于一张图片,如果同样是300300分辨率的jpeg和png两张图,文件大小可能差几倍,但是渲染后的内存开销是完全一样的。
如果一张图片尺寸是300300,解压后大小是3003004。而在view的大小是6060,最终使用的是:6060*4,那么多出的内存将会抛弃。造成资源浪费。所以我们要协商好尺寸。
所以制定了一套方案,服务端将精确尺寸的图片下发到不同机型,从根本上将内存使用降低。
b:及时回收图片
单张图片占用内存不多,累计起来却非常可观。因此,当页面pop掉时,有必要清理页面内图片的内存缓存。其次,列表类的页面在滑动时,可以及时清理那些滑出屏幕图片的内存缓存。
使用imageNamed这个方法生成的UIImage对象,会在应用的bundle中寻找图片,如果找到,则Cache到系统缓存中,作为内存的cache,而程序员是无法操作cache的,只能由系统自动处理,网络图片就可以用自己的cache逻辑管理了
c:注意图片缩放方式
处理图片缩放时,直接使用UIImage会在解码时读取文件占用一部分内存,还会生成中间位图bitmap消耗大量内存,而ImageIO不存在上述两种内存消耗,只会占用最终图片大小的内存,可以使用UIGraphics相关函数
UIGraphicsBeginImageContextWithOptions(newSize, NO, 0);[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();
检测工具:
Instruments
MLeaksFinder
iOS:内存优化思路相关推荐
- IOS 内存优化和调试技巧
基础部分 1: 图片内存大小小结 a: 图片:是占用内存的大户,尤其是手机游戏图片资源众多.对图片资源在内存中占用量的计算成为J2ME游戏开发者的经常性工作,CoCoMo来解释一下如何计算图片在内存中 ...
- iOS内存优化及排查方法
1.IBOutlet 对象需要release 2.不停的往UIView,特别是UIScrollView上add相同SubView.一定要记得清除之前的SubView,并且在dealloc函数中执行该方 ...
- [原]unity3d ios平台内存优化(一)
关于内存优化,人云亦云 各有己见.本文将通过设置Strpping Level ,减少内存使用. 先看三幅图: 1.没做任何优化,默认选项 2.设置Stripping level 为 Use micro ...
- 【 iOS 应用开发 】 UIKit 控件 ( 代码生成控件 | UIView 属性方法 | Storyboard | Bundle | Property List | 动画 | 图片内存优化 )
文章目录 一. 代码生成控件 1. 创建设置项目 ( 1 ) 创建项目 ( ① 选择 Create a new Xcode project | ② 创建 Single View Application ...
- ios 内存深度优化_iOS内存优化
内存优化工具 Instruments的Allocations 这个工具能显示出应用的实际内存占用,并可以按大小进行排序.我们只要找出那些占用高的,分析其原因,找到相应的解决办法. Xcode的Memo ...
- IOS开发之——图片的内存优化
一 概述 创建Image的方式有两种: UIImage *image=[UIImage imageNamed:imageName]-内存由系统管理 UIImage *image=[UIImage im ...
- iOS性能优化-内存优化
https://blog.csdn.net/a184251289/article/details/82589128 2018年09月10日 14:25:31 xingshao1990 阅读数:328 ...
- Unity手游iOS内存分析和测试
内存是Unity手游的硬伤,如果没有做好内存的相关管理和详细的测试,游戏极有可能出现卡顿.闪退等影响用户体验的现象.在此,笔者为我们介绍了一些Unity手游内存分析和测试过程中比较实用的测试场景案例. ...
- iOS 启动优化和安装包瘦身
iOS 启动优化和安装包瘦身 1 启动优化 在iPhone的启动方式中,分为冷启动和热启动两种方式: 1.冷启动(Cold Launch):从零开始启动APP ,需要系统新创建一个进程进行启动,这是一 ...
最新文章
- python编程超市购物系统_python实现简单购物车系统(练习)
- 分叉币众多,为什么说只有BCH能活下来?
- 第二百七十五节,MySQL数据库安装和介绍
- VS cmake远程调试ubuntu项目生成报错:“Does not match the generator used previously: Ninja“(删除.vs隐藏文件夹)
- web.config中httpRunTime的属性
- 【codevs1087NOIP2003】麦森数,高精度+对数+快速幂
- 基于JAVA+SpringMVC+Mybatis+MYSQL的族谱管理系统
- html中倒计时精确到毫秒,倒计时功能 精确到毫秒
- SQL Server 2019重新安装失败的处理方法
- 一个很好用的移动端Lightbox特效插件(一)
- [推荐]15款非常好用的新浪,腾讯短链接生成器,一次生成永不失效,巨好用!
- 网络里面如何添加计算机,计算机如何添加网络协议
- java中hash值什么意思_到底什么是hash?它起什么作用?
- 计算机毕业设计ssm电影售票管理系统n9y72系统+程序+源码+lw+远程部署
- 攻防世界writeup
- srand和rand详细讲解
- 使用Python获取最新疫情数据,制作可视化动态地图,实时展示各地情况
- C语言内功修炼之函数栈帧的创建与销毁(举例加图解)
- ibm服务器型号历史,IBM System X系列服务器的历史
- 远征日服·信喵之野望 按键精灵脚本6.高级自动抽吉