一、性能优化整体认知(先建立高度)
✅ Q61:iOS 性能优化主要分哪几类?
iOS 性能优化主要分为四大方向:
1️⃣ 启动性能
2️⃣ 渲染性能(卡顿/FPS)
3️⃣ 内存性能
4️⃣ 网络与 IO 性能
本质是 CPU、GPU、Memory、IO 资源竞争优化。
二、卡顿优化(★★★★★ 必问)
✅ Q62:什么是卡顿?
iOS 屏幕刷新率为 60Hz(或 120Hz),
每帧必须在 16.67ms 内完成。
超过时间 → 掉帧 → 卡顿
✅ Q63:如何监控卡顿
通过 RunLoop Observer + 主线程心跳检测:
- 监听 RunLoop 状态:
kCFRunLoopBeforeSources
kCFRunLoopAfterWaiting - 记录时间差
- 超过阈值(如 100ms)认为发生卡顿
高级补充(加分):
结合 stack trace 采样
上报后台分析
✅ Q64:卡顿常见原因?
- CPU 问题
主线程大量计算
JSON 解析
layout 计算 - GPU 问题
离屏渲染
-过度透明 - IO 问题
主线程读写文件
图片解码
✅ Q65:如何定位卡顿?
复现
↓
FPS 监控
↓
Time Profiler
↓
Main Thread Call Tree
↓
定位耗时函数
三、列表优化(UITableView / SwiftUI 必问)
✅ Q66:列表为什么会卡?
1️⃣ 频繁 layout
2️⃣ 图片解码
3️⃣ 主线程计算
4️⃣ 离屏渲染
5️⃣ cell 重用不当
✅ Q67:列表优化方案?
- CPU 优化
高度缓存
预计算 layout - GPU 优化
避免透明视图
减少圆角 - IO 优化
图片异步解码
图片缓存
主线程只做 UI。
✅ Q68:为什么图片会导致卡顿?
因为:
图片解码发生在主线程。
JPEG/PNG → Bitmap 是耗 CPU 操作。
优化:
后台解码
Downsampling
四、离屏渲染(面试超级高频)
✅ Q69:什么是离屏渲染?
GPU 在屏幕外创建 buffer,再合成显示。
- 增加:
GPU 内存开销
上下文切换
✅ Q70:哪些操作触发离屏渲染?
- 必须能一口气说:
cornerRadius + masksToBounds
shadow
group opacity
mask
✅Q71:如何优化圆角?
CAShapeLayer
预渲染图片
shouldRasterize(谨慎)
五、启动优化(★★★★★ 大厂最爱
Q72:App 启动阶段划分?
Pre-main
↓
main
↓
首屏渲染
✅ Q73:Pre-main 做了什么?
- 必须说:
dyld 加载 dylib
runtime 初始化
+load 执行
✅ Q74:如何优化启动时间?
- 减少 dylib
合并 framework - 减少 +load
改 initialize - 延迟初始化
lazy load - 异步非关键任务
首屏优先原则。
六、内存优化(高级区)
✅ Q75:如何检测内存泄漏?
Xcode Memory Graph
Instruments Leaks
Allocations
✅ Q76:内存暴涨常见原因?
图片未释放
循环引用
大对象缓存
autoreleasepool 未释放
✅ Q77:如何优化图片内存?
- 必须说:
Downsample
WebP
按需加载
图片缓存淘汰策略
七、Crash 优化
✅ Q78:如何降低 Crash 率?
Crash 收集
↓
分类统计
↓
Top N 修复
↓
灰度验证
- 工具:
崩溃符号化
堆栈分析
✅ Q79:常见 Crash 类型?
EXC_BAD_ACCESS
数组越界
KVO
多线程问题
八、性能体系
客户端监控:
- FPS
- 卡顿
- 启动时间
- 内存
- Crash
↓
数据上报
↓
后台聚合分析
↓
版本对比 & 预警
性能优化不是一次行为,而是持续监控体系。