前言:ARC

内存管理需要说说ARC:

ARC(Automatic Reference Counting):自动引用计数内存管理。ARC是一种编译器功能,它通过LLVM编译器和Runtime协作来进行自动管理内存。

ARC如何进行自动管理内存?
LLVM编译器会在编译时在合适的地方为 OC 对象插入retainreleaseautorelease代码来自动管理对象的内存。

计算机语言分为:编译型语言、直译式语言(脚本语言)

语言 编译形式 效率 调试
编译型语言 C++ Objective C Swift Kotlin 先通过编译器生成机器码
机器码可以直接在 CPU 上执行
执行效率较高 调试周期长
直译式语言 JavaScript Python 不需要经过编译,在执行时
通过一个中间的解释器将代码解释为 CPU 可以执行的代码
执行效率低 编写调试方便

编译又分为前端编译和后端编译

1:前端编译

前端编译:主要是通过前端编译器Clang,生成中间码。Clang 主要处理:

  1. 预处理: 主要是宏替换(把宏嵌入到对应的位置),头文件的导入注释删除
  2. 词法分析: 这里把源文件中的代码转化为特殊的标记流,源码被分割成一个一个的字符和单词,在行尾Loc中都标记出了源码所在的对应源文件和具体行数,方便在报错时定位问题。
  3. 语法分析: 这一步是把词法分析生成的标记流,解析成一个抽象语法树,同样地,在这里面每一节点也都标记了其在源码中的位置。
  4. 静态分析:分析代码是否存在问题,给出错误信息和修复方案:如出现方法被调用但是未定义、定义但是未使用的变量等
  5. 前面的过程完了,就会生成中间代码(bitCode) IR:并会对bitcode进行各种类型的优化,将bitcode代码进行一些逻辑等价的转换,使得代码的执行效率更高,体积更小

2:后端编译

后端编译:主要由后端编译器LLVM,把优化后的中间码bitcode编译为指定目标架构的机器码,比如X86Backend负责把bitcode编译为x86指令集的机器码

在 iOS 编译中,编译器后端其实就是 LLVM 自己提供的一套后端。它包含了 机器码生成器、链接器等工具,会对 IR
进行机器无关的代码优化,生成机器语言。

二、内存优化思路

当内存使用过高,可能就会发生OOM(Out-Of-Memory)。所以内存使用过高,系统就会回收一些内存:

  1. 先回收优先级极低的进程和一些正常情况下随时可回收的进程。

  2. 如果还有内存压力,就会杀掉后台进程以及一些后台执行的任务

  3. 最终还有内存压力,就会发生OOM

内存问题主要包括两个部分

  1. 常见循环引用导致的内存泄露
  2. 大量数据加载及使用导致的内存警告

内存优化也是注意处理这两个部分

1、循环引用

循环引用对App有潜在的危害,会使内存消耗过高,性能变差和Crash等,主要从以下几个方面入手

  1. Delegate
    代理要声明为weak,不能用strong。
  2. NSTimer
    RunLoop会强引用target,可以使用weakProxy 消息转发。使用GCD timer
  3. Block
    _weak 修饰对象
  4. C语法,malloc之后调用free

二、大量数据加载导致内存暴涨

在一些使用场景里,比如整个页面初始化,要分配整个使用内存,批量的图片处理,会出现一段时间内需要加载大量内容,占用过高的内存。而iOS的低内存机制就是给你一个阈值,只要你的APP超过这个数值,哪怕只是一瞬间也会直接崩溃。因此我们就需要对这种瞬间的高增幅去进行优化。我们就需要用时间去换空间,拉长整个加载步骤。

  1. 懒加载:时间去换空间
  2. 单次出现的图片使用imageWithContentsOfFile加载
  3. 在循环里面使用autoreleasepool,让临时对象及时释放
  4. 图片内存使用优化:使用适当尺寸的图片、及时回收图片、注意图片缩放方式
a:使用适当尺寸的图片

解压后的图片是由一个个像素点组成的。每个像素点一般有R、G、B、A(红绿蓝透明度)四个通道,每个通道是8位,因此一个像素通常占用4字节。对于一张图片,如果同样是300300分辨率的jpeg和png两张图,文件大小可能差几倍,但是渲染后的内存开销是完全一样的。
如果一张图片尺寸是300
300,解压后大小是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:内存优化思路相关推荐

  1. IOS 内存优化和调试技巧

    基础部分 1: 图片内存大小小结 a: 图片:是占用内存的大户,尤其是手机游戏图片资源众多.对图片资源在内存中占用量的计算成为J2ME游戏开发者的经常性工作,CoCoMo来解释一下如何计算图片在内存中 ...

  2. iOS内存优化及排查方法

    1.IBOutlet 对象需要release 2.不停的往UIView,特别是UIScrollView上add相同SubView.一定要记得清除之前的SubView,并且在dealloc函数中执行该方 ...

  3. [原]unity3d ios平台内存优化(一)

    关于内存优化,人云亦云 各有己见.本文将通过设置Strpping Level ,减少内存使用. 先看三幅图: 1.没做任何优化,默认选项 2.设置Stripping level 为 Use micro ...

  4. 【 iOS 应用开发 】 UIKit 控件 ( 代码生成控件 | UIView 属性方法 | Storyboard | Bundle | Property List | 动画 | 图片内存优化 )

    文章目录 一. 代码生成控件 1. 创建设置项目 ( 1 ) 创建项目 ( ① 选择 Create a new Xcode project | ② 创建 Single View Application ...

  5. ios 内存深度优化_iOS内存优化

    内存优化工具 Instruments的Allocations 这个工具能显示出应用的实际内存占用,并可以按大小进行排序.我们只要找出那些占用高的,分析其原因,找到相应的解决办法. Xcode的Memo ...

  6. IOS开发之——图片的内存优化

    一 概述 创建Image的方式有两种: UIImage *image=[UIImage imageNamed:imageName]-内存由系统管理 UIImage *image=[UIImage im ...

  7. iOS性能优化-内存优化

    https://blog.csdn.net/a184251289/article/details/82589128 2018年09月10日 14:25:31 xingshao1990 阅读数:328 ...

  8. Unity手游iOS内存分析和测试

    内存是Unity手游的硬伤,如果没有做好内存的相关管理和详细的测试,游戏极有可能出现卡顿.闪退等影响用户体验的现象.在此,笔者为我们介绍了一些Unity手游内存分析和测试过程中比较实用的测试场景案例. ...

  9. iOS 启动优化和安装包瘦身

    iOS 启动优化和安装包瘦身 1 启动优化 在iPhone的启动方式中,分为冷启动和热启动两种方式: 1.冷启动(Cold Launch):从零开始启动APP ,需要系统新创建一个进程进行启动,这是一 ...

最新文章

  1. python编程超市购物系统_python实现简单购物车系统(练习)
  2. 分叉币众多,为什么说只有BCH能活下来?
  3. 第二百七十五节,MySQL数据库安装和介绍
  4. VS cmake远程调试ubuntu项目生成报错:“Does not match the generator used previously: Ninja“(删除.vs隐藏文件夹)
  5. web.config中httpRunTime的属性
  6. 【codevs1087NOIP2003】麦森数,高精度+对数+快速幂
  7. 基于JAVA+SpringMVC+Mybatis+MYSQL的族谱管理系统
  8. html中倒计时精确到毫秒,倒计时功能 精确到毫秒
  9. SQL Server 2019重新安装失败的处理方法
  10. 一个很好用的移动端Lightbox特效插件(一)
  11. [推荐]15款非常好用的新浪,腾讯短链接生成器,一次生成永不失效,巨好用!
  12. 网络里面如何添加计算机,计算机如何添加网络协议
  13. java中hash值什么意思_到底什么是hash?它起什么作用?
  14. 计算机毕业设计ssm电影售票管理系统n9y72系统+程序+源码+lw+远程部署
  15. 攻防世界writeup
  16. srand和rand详细讲解
  17. 使用Python获取最新疫情数据,制作可视化动态地图,实时展示各地情况
  18. C语言内功修炼之函数栈帧的创建与销毁(举例加图解)
  19. ibm服务器型号历史,IBM System X系列服务器的历史
  20. 远征日服·信喵之野望 按键精灵脚本6.高级自动抽吉

热门文章

  1. Linux shell随手记——ps -ef
  2. RStudio介绍及入门
  3. ubuntu如何安装lsb_release工具?
  4. Python 画沿着高对称性的能带图
  5. 关于火星坐标、偏移、加偏和纠偏、无偏的理解
  6. 【二维前缀和】小白月赛-秘法地震
  7. python - 算法 - 简单 - 罗马数字转换
  8. 修改Cisco交换机ntp服务器,Cisco交换机时间服务(NTP)的设置步驟
  9. kubernetes 使用kubectl port-forward 访问应用
  10. 知识问答(KBQA)两种主流方法:基于语义解析和基于信息检索的方法介绍