前言

之前写过一篇iOS 内存漫谈,主要在编程语言层面,今天我们从工程架构层面聊聊 iOS 内存问题。

iOS 内存管理基础

┌─────────────────┬─────────────────┬─────────────────┬─────────────────┐
│     内存类型     │     大小限制     │     管理方式     │   OOM 风险      │
├─────────────────┼─────────────────┼─────────────────┼─────────────────┤
│ 堆内存 (Heap)   │ 应用级限制       │ 开发者手动管理    │    高           │
│                 │ (几十MB-几GB)    │ (ARC/MRC)       │                 │
├─────────────────┼─────────────────┼─────────────────┼─────────────────┤
│ 栈内存 (Stack)  │ 每个线程几MB     │ 系统自动管理     │    低           │
├─────────────────┼─────────────────┼─────────────────┼─────────────────┤
│ 虚拟内存        │ 设备物理内存限制  │ 系统统一管理     │    中           │
└─────────────────┴─────────────────┴─────────────────┴─────────────────┘

系统性 OOM 防护架构

应用层防护 (Your Code)
    |
框架层防护 (UIKit/Foundation)  
    |
系统层防护 (iOS Kernel)
    |
硬件层防护 (MMU)

下面我们依次从这几个层面来聊聊内存管理问题。

总结

┌─────────────────┬─────────────────┬─────────────────┬─────────────────┐
│     防护层级     │     策略         │     工具         │     目标         │
├─────────────────┼─────────────────┼─────────────────┼─────────────────┤
│ 应用层          │ 内存警告处理      │ NSCache         │ 及时释放资源     │
│                 │ 图片优化加载      │ 懒加载          │ 减少峰值内存     │
├─────────────────┼─────────────────┼─────────────────┼─────────────────┤
│ 架构层          │ 分页数据加载      │ 内存监控框架     │ 预防性管理       │
│                 │ 缓存策略优化      │ 泄漏检测        │ 早期发现问题     │
├─────────────────┼─────────────────┼─────────────────┼─────────────────┤
│ 系统层          │ 后台内存优化      │ Instruments     │ 系统级防护       │
│                 │ 虚拟内存管理      │ os_signpost    │ 利用系统机制     │
└─────────────────┴─────────────────┴─────────────────┴─────────────────┘