当前位置: 首页 > news >正文

ARC 如何工作 swift

 

这也是 Swift 面试必问基础题,通常还会接着问 weak / unowned / 循环引用 / 析构时机。下面给你一个面试可直接说的答案 + 原理补充 + 常见追问。一、面试标准答案(推荐背这个)ARC(Automatic Reference Counting)是 Swift 的内存管理机制,用于自动管理引用类型(class)的生命周期。它的工作方式如下:1. 每次创建对象时,ARC 分配内存并建立引用计数 = 1
2. 当有新强引用指向该对象时,引用计数 +1
3. 当强引用离开作用域或被置 nil 时,引用计数 -1
4. 当引用计数降为 0 时:- ARC 立即调用 deinit• 释放对象占用内存✅ 一句话总结:  
ARC 通过在编译期插入 retain / release 逻辑,保证对象在没有强引用时被自动释放。二、简单示例class Person {deinit { print("Person deinited") }
}func test() {let p = Person()   // 引用计数 = 1
}                      // p 离开作用域 → 引用计数 = 0 → deinit
三、底层简单理解(中高级面试)• Swift ARC 不是垃圾回收• 编译器在合适位置自动插入:• retain(引用 +1)• release(引用 -1- 当 release 后发现引用 == 0:• 调用 deinit• 释放堆内存所有发生在 编译期,运行时没有周期扫描。四、ARC 不管理的东西(常被问)类型 ARC 是否管理class 实例 ✅struct / enum ❌(栈自动释放)闭包 ❌(但捕获引用)Core Foundation ❌(需手动 CFRelease / Unmanaged)循环引用 ❌(需 weak / unowned)五、weak / unowned 与 ARC 的关系(高频追问)weak• 不增加引用计数• 对象释放后自动置 nil• 必须是 Optional
weak var delegate: Delegate?unowned• 不增加引用计数• 假设对象一定存在,不会置 nil• 访问已释放对象会 崩溃(EXC_BAD_ACCESS)
unowned var owner: Owner✅ 使用原则:
• 可能变成 nil → weak• 生命周期严格长于当前对象 → unowned六、常见循环引用场景(必会)class A {var b: B?
}
class B {var a: A?
}➡ 解决:weak var a: A?闭包循环引用:
self.closure = { [weak self] inself?.doSomething()
}七、一句终极总结(面试收尾用)ARC 通过自动维护引用计数来决定对象的生命周期,当强引用计数降为 0 时立即释放对象;它只管理 class,不处理循环引用,需通过 weak / unowned 避免。

 

http://www.jsqmd.com/news/988393/

相关文章:

  • PyTorch实战:用DBB结构重参数化无损提升ResNet精度(附完整代码)
  • CKKS同态加密中的旋转操作:在隐私计算与联邦学习里,它到底解决了什么实际问题?
  • 从心电图到手势识别:用UCR数据集实战5个跨领域时间序列分类项目(附完整代码)
  • 从DZ47到智能空开:手把手教你读懂断路器型号代码,选型不求人
  • git遇见的问题[2]
  • 从投稿到接收:如何用Elsevier LaTeX模板高效管理你的学术论文写作流程
  • 2026年 AI推广服务商推荐榜单:GEO内容/短视频/社媒全链路智能营销,赋能企业精准获客与品牌增长 - 品牌发掘
  • Redis分布式锁进阶第九十六篇
  • 浏览器CDP自动化检测技术-Error和Worker
  • 手机相机开发避坑实录:从Sensor数据流到HAL3的那些“坑”与解法
  • Excel定位条件全解析:从‘常量/公式’到‘差异单元格’,搞定数据核对与清理
  • 信息学奥赛刷题实战:OpenJudge NOI 1.11 08题,用C++ STL的set和sort两种思路搞定‘不重复输出’
  • IDEA新手避坑指南:从Gitee拉取团队项目到成功运行Tomcat的完整流程
  • 从jQuery的这两个CVE漏洞,聊聊前端安全中容易被忽略的‘消毒’陷阱
  • OSPF建立邻居的影响因素
  • Presto时间函数保姆级避坑指南:从日期计算到时区转换,一篇搞定
  • 2026常州汽车音响改装哪家靠谱?同城实测测评首选音乐人生 - 音乐人生汽车音响
  • LangGraph多智能体系统工程实践:状态驱动的网页数据采集架构
  • PowerShell操作FTP踩坑全记录:从PSFTP模块的Bug到手动调用.Net类的终极方案
  • FPGA资源紧张?试试这个‘慢工出细活’的移位相加乘法器设计与优化技巧
  • 别再只用折线图了!Grafana 8.0+ 的 Time Series 面板,教你玩出监控新花样
  • 2026年电滑环公司选型指南:驰宏科技如何定义高性能滑环新标准? - 品牌报告
  • Jvm内存以及垃圾回收相关知识
  • 平时妈妈带娃偶尔老人帮忙,哪个成长椅两个人都能轻松调节?|居森皇冠椅多人带娃操作全指南 - 知行集录
  • 别再死记硬背排序算法了!用‘信息学奥赛1245题’带你理解STL的sort、unique和set到底怎么选
  • 告别迷茫!手把手教你用ArcGIS+GTB搞定生态源地MSPA分析(附避坑指南)
  • 从‘切绳子’到‘二分答案’:信息学奥赛经典题P1577的保姆级整数二分教程
  • 在VSCode里像玩Arduino一样玩STM32:基于STM32CubeMX和Cortex-Debug插件的图形化调试实战
  • 手机芯片里的‘交通警察’:一文搞懂SPMI总线如何管理电源与时钟(附时序图解析)
  • 别再只盯着5G了!从星链到北斗,一文搞懂卫星通信到底是怎么‘上网’的