前言
之前写过一篇iOS 内存漫谈,主要在编程语言层面,今天我们从工程架构层面聊聊 iOS 内存问题。
iOS 内存管理基础
┌─────────────────┬─────────────────┬─────────────────┬─────────────────┐
│ 内存类型 │ 大小限制 │ 管理方式 │ OOM 风险 │
├─────────────────┼─────────────────┼─────────────────┼─────────────────┤
│ 堆内存 (Heap) │ 应用级限制 │ 开发者手动管理 │ 高 │
│ │ (几十MB-几GB) │ (ARC/MRC) │ │
├─────────────────┼─────────────────┼─────────────────┼─────────────────┤
│ 栈内存 (Stack) │ 每个线程几MB │ 系统自动管理 │ 低 │
├─────────────────┼─────────────────┼─────────────────┼─────────────────┤
│ 虚拟内存 │ 设备物理内存限制 │ 系统统一管理 │ 中 │
└─────────────────┴─────────────────┴─────────────────┴─────────────────┘系统性 OOM 防护架构
应用层防护 (Your Code)
|
框架层防护 (UIKit/Foundation)
|
系统层防护 (iOS Kernel)
|
硬件层防护 (MMU)下面我们依次从这几个层面来聊聊内存管理问题。
总结
┌─────────────────┬─────────────────┬─────────────────┬─────────────────┐
│ 防护层级 │ 策略 │ 工具 │ 目标 │
├─────────────────┼─────────────────┼─────────────────┼─────────────────┤
│ 应用层 │ 内存警告处理 │ NSCache │ 及时释放资源 │
│ │ 图片优化加载 │ 懒加载 │ 减少峰值内存 │
├─────────────────┼─────────────────┼─────────────────┼─────────────────┤
│ 架构层 │ 分页数据加载 │ 内存监控框架 │ 预防性管理 │
│ │ 缓存策略优化 │ 泄漏检测 │ 早期发现问题 │
├─────────────────┼─────────────────┼─────────────────┼─────────────────┤
│ 系统层 │ 后台内存优化 │ Instruments │ 系统级防护 │
│ │ 虚拟内存管理 │ os_signpost │ 利用系统机制 │
└─────────────────┴─────────────────┴─────────────────┴─────────────────┘