Instruments 是什么
Instruments 是苹果官方的性能剖析套件:内存、CPU、能耗、卡顿,全部在一个工具里录出来看。它把黑盒的性能问题变成一条条时间线和柱状图,让你知道时间和电量花在哪。
性能问题不该靠猜:Instruments 把它录成数据,问题自己会浮出来。
这篇按内存、CPU、卡顿、能耗四块讲 Instruments 实战。
内存分析找泄漏
用 Allocations 录制一次页面进出,看对象实例数是否只增不减。怀疑泄漏再用 Leaks 模板。常见来源:循环引用、Block 捕获 self、单例持有页面。
// 打破循环引用
weak var weakSelf = self
queue.async { weakSelf?.doSomething() }
用 weak 打断互相持有,泄漏就消了。
Time Profiler 找 CPU 热点
Time Profiler 录一段交互,看调用树里哪个函数占比最高。占 CPU 最多的那个就是要优化的热点。大图解码、同步 IO、大列表计算,都是常见热点。
Instruments 模板速查
- Allocations内存分配与增长。
- Leaks循环引用泄漏。
- Time ProfilerCPU 调用树。
- Energy Log能耗与唤醒。
卡顿与主线程
滑动卡多半是主线程被同步任务堵住。用 Main Thread Checker 配合 Time Profiler,看主线程那段时间在跑什么。把它挪到后台队列,帧率就回来。
能耗与电量
耗电快,用 Energy Log 看 CPU 唤醒次数与网络活动。频繁唤醒、轮询网络、持续定位,都是耗电大户。降采样、合批、按需唤醒,是能耗优化的三板斧。
自动化与回归
Instruments 也能脚本化跑,把关键指标接进 CI。每次发版自动跑一遍,内存峰值、启动时间超标就报警。性能退化不该靠用户反馈发现。
- 关键指标固化成基线。
- 接 CI 自动回归。
- 超标当 bug 处理。
实战:修一次内存泄漏
进页面退出来再进,Allocations 里控制器实例数一直涨。
NotificationCenter.default.addObserver(
forName: .tick, object: nil, queue: nil
) { _ in self.refresh() }
Block 里强引用了 self,页面退出没释放。改成 weak 捕获、并在 deinit 移除观察者,实例数恢复正常。性能优化的闭环就是录、找、改、再录。