MST

星途 面试题库

面试题:Objective-C利用Instruments分析循环引用导致的内存泄漏

假设在Objective-C项目中有两个类A和B,A持有B的实例,B也持有A的实例,形成循环引用。请描述如何利用Instruments工具定位到这种循环引用导致的内存泄漏问题,并且说明从Instruments的分析结果中,怎样判断是由循环引用造成的内存泄漏。
40.1万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试
  1. 使用Instruments定位循环引用导致的内存泄漏
    • 步骤一:打开Instruments
      • 打开Xcode,选择“Product” -> “Profile”,这会自动启动Instruments并加载你的Objective - C项目。
    • 步骤二:选择Leaks模板
      • 在Instruments中,选择“Leaks”模板。这个模板专门用于检测内存泄漏。
    • 步骤三:运行项目
      • 在Instruments中点击“Record”按钮开始记录,然后在你的iOS模拟器或真机上运行Objective - C项目。执行与类A和类B相关的操作,确保触发可能存在的循环引用场景。
    • 步骤四:分析Leaks结果
      • 当你认为可能已经触发循环引用后,停止记录。Instruments会展示内存泄漏的相关信息。查看Leaks列表,找到疑似由类A和类B循环引用导致的泄漏对象。
  2. 从Instruments分析结果判断循环引用造成的内存泄漏
    • 对象存活分析
      • 在Leaks报告中,如果发现类A和类B的实例对象一直存在,即使它们应该已经超出作用域并被释放,这可能是循环引用的迹象。例如,在正常情况下,当包含类A和类B实例的某个方法执行完毕后,它们应该被释放,但在Leaks报告中仍能看到它们,说明存在引用使其无法被释放。
    • 引用链分析
      • 点击Leaks报告中的泄漏对象,Instruments会展示该对象的引用链。如果在引用链中看到类A引用类B,同时类B又反向引用类A,形成了一个闭环引用链,那么可以基本确定是由循环引用造成的内存泄漏。例如,引用链显示A -> B -> A,这就表明A和B之间存在循环引用导致对象无法被释放,从而产生内存泄漏。