一、启动优化
主要是启动耗时,处理的主要方式是
代码方面:
- 移除多余的:有些SDK是仅用来Debug测试的,没必要带到Release(条件编译)
- 延迟非关键:如广告SDK
- 分配到子线程处理,并发处理
其他方面:
- +load
- 动态库dylib合并
排查工具:Time Profiler
二、内存优化
及时释放(不要只持有,但不释放,如避免单例持有大对象)
autorelease
1、内存暴涨(Memory Spike)
大量小对象 → 一次性加载/渲染过多 cell、图片、富文本。(Cell 复用)
少量大对象 → 单个对象占用内存非常大(加载大图/视频,例如单张图片 100MB,或一个大 Data blob)
短时间内创建大量对象或加载大资源,造成内存占用过多,可能引发系统回收甚至崩溃。
- 原因:循环创建对象、大量数据瞬时加载、大图加载等。
- 工具检测:Instruments -> Allocations / Memory Usage。
示例:
JSON 解析时递归错误,不断循环创建对象;
请求没做分页/单页数量极大(之前遇到为了省去Flutter中列表的数据处理,直接单页请求4000个数据)
加载大图,大图直接解码显示原始位图,占用内存太大。优化:Downsampling(缩放解码),只解码需要显示的尺寸/缩略图,而不是原图全尺寸。
1
解码成位图 (bitmap): 4000 x 4000 图片 (RGBA8888) = 4000 * 4000 * 4 bytes ≈ 64 MB
之前在发布内容时候(Flutter应用)涉及到多视频的压缩
2、内存泄漏(Memory Leak):
- 原因:未释放的强引用循环、未释放的资源(解决循环引用导致释放不掉的问题)。
- 工具检测:Xcode Instruments -> Leaks。
内存抖动(Memory Churn):
- 原因:频繁的内存分配和释放。图片/数据频繁解码滑动列表时,每次都解码同一张图片,没有缓存。
- 影响:性能下降、电池消耗增加。
APP 被系统 Kill(Jetsam):
- 原因:使用内存超出系统限制。
- 检查:控制台日志包含 JetsamEvent。
排查工具:Instruments 的 Leaks 和 Allocations 分析内存泄漏
1、正确的地方使用 reuseIdentifier
2、内存泄漏
1、使用Product-Analyze分析内存泄
利用Product-Analyze分析内存泄露,并不能把所有的内存泄露查出来,因为有的内存泄露是在运行时,用户操作时才产生的。那就需要用到Instruments了。
三、卡顿优化
《卡顿监控.md》
《列表优化.md》
四、网络优化
《网络框架.md》