Swift面试题更新 2026-08-03

在 Swift 中,循环引用指的是什么现象?通常可以采用哪些手段来防止或解除循环引用?

考察说明

考察对 Swift 自动引用计数机制下循环引用问题的理解及解决手段。

回答思路

  1. 【回答框架 1】循环引用指两个或多个实例互相持有对方的强引用,导致引用计数始终不为零,内存无法释放,形成泄漏。
  2. 【回答框架 2】避免循环引用的常见手段包括:使用 weak 修饰符声明弱引用,不增加引用计数,当被引用实例释放后自动置为 nil;使用 unowned 修饰符声明无主引用,也不增加引用计数,但假定被引用实例生命周期一致,访问已释放实例会崩溃;在闭包捕获列表中指定 [weak self] 或 [unowned self],避免闭包与对象互相持有。
  3. 【回答框架 3】选择 weak 还是 unowned 取决于引用生命周期:若被引用实例可能先于当前实例释放,应使用 weak;若两者生命周期相同,可使用 unowned。在逃逸闭包中通常优先使用 weak 避免崩溃风险。
  4. 【回答框架 4】实践中还需注意代理模式、定时器等场景,避免强引用链。
  5. 【回答框架 5】Swift 的 ARC 是编译期机制,无法自动检测循环引用,开发需手动管理引用关系。
  6. 【关键点 1】循环引用是强引用互相持有导致的内存泄漏
  7. 【关键点 2】weak 引用不增加计数且自动置 nil
  8. 【关键点 3】unowned 假定生命周期一致,访问已释放对象会崩溃
  9. 【关键点 4】闭包使用捕获列表避免循环引用
  10. 【易错点 1】unowned 引用在对象释放后访问会导致运行时崩溃
  11. 【易错点 2】并非所有强引用都会造成循环引用,只有互相持有才危险
  12. 【易错点 3】闭包中直接使用 self 可能隐式持有,需显式使用捕获列表