面试题答案
一键面试基本步骤
- 打开Instruments:在Xcode菜单栏中选择“Product” -> “Profile”,此时会弹出Instruments应用程序,并自动加载当前的Swift项目。
- 选择Leaks模板:在Instruments众多模板中,选择“Leaks”模板。这个模板专门用于检测应用程序中的内存泄漏。
- 运行应用并操作:点击Instruments中的录制按钮,开始监控应用程序。然后在模拟器或真机上运行你的Swift项目,并模拟可能导致内存泄漏的操作,例如反复进出怀疑有内存泄漏的视图控制器。
- 停止录制:完成操作后,点击Instruments中的停止按钮,停止监控。
关键指标
- Leaks:此列显示了检测到的内存泄漏块的数量。如果该数值不为0,则表明存在内存泄漏。
- Address:泄漏内存块的内存地址。
- Size:泄漏内存块的大小。
- Responsible Library:负责分配泄漏内存的库。通常是应用程序本身,但也可能是第三方库。
- Responsible Caller:导致内存泄漏的具体函数调用。这对于定位问题代码非常关键。
定位视图控制器内存泄漏问题
- 查看Leaks列表:在Instruments的Leaks面板中,查找与视图控制器相关的内存泄漏。通常,泄漏对象的类名或相关描述会暗示与视图控制器的关系。
- 分析Call Stack:点击Leaks列表中的某一泄漏项,查看下方的Call Stack(调用栈)。Call Stack会展示导致内存泄漏的函数调用路径。从这里可以追溯到视图控制器中创建对象但未正确释放的代码位置。
- 关注Object Graph:利用Instruments的Object Graph功能。在选定泄漏对象后,可以查看其对象图,了解该对象与其他对象的引用关系。这有助于发现是否存在循环引用等导致内存泄漏的常见问题,例如视图控制器与其他对象之间存在相互强引用,使得它们都无法被释放。