当前位置: 首页 > 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.gsyq.cn/news/1500145.html

相关文章:

  • Mac玩转51单片机:手把手教你用sdcc编译和stcgal烧录(附CH340驱动解决方案)
  • 从心电图到手势识别:用UCR数据集实战5个跨领域时间序列分类项目(附完整代码)
  • PyTorch实战:用DBB结构重参数化无损提升ResNet精度(附完整代码)
  • Redis分布式锁进阶第九十六篇
  • 信息学奥赛刷题实战:OpenJudge NOI 1.11 08题,用C++ STL的set和sort两种思路搞定‘不重复输出’
  • 从DZ47到智能空开:手把手教你读懂断路器型号代码,选型不求人
  • IDEA新手避坑指南:从Gitee拉取团队项目到成功运行Tomcat的完整流程
  • 从jQuery的这两个CVE漏洞,聊聊前端安全中容易被忽略的‘消毒’陷阱
  • Presto时间函数保姆级避坑指南:从日期计算到时区转换,一篇搞定
  • 2026常州汽车音响改装哪家靠谱?同城实测测评首选音乐人生 - 音乐人生汽车音响
  • Jvm内存以及垃圾回收相关知识
  • 平时妈妈带娃偶尔老人帮忙,哪个成长椅两个人都能轻松调节?|居森皇冠椅多人带娃操作全指南 - 知行集录
  • 告别迷茫!手把手教你用ArcGIS+GTB搞定生态源地MSPA分析(附避坑指南)
  • 手机芯片里的‘交通警察’:一文搞懂SPMI总线如何管理电源与时钟(附时序图解析)
  • 别再只用SE模块了!手把手教你用PyTorch实现CBAM注意力,轻松涨点
  • OpenMV玩串口通信后‘变砖’?记一次因固化脚本导致的IDE连接失败与修复实录
  • 从逻辑分析仪抓包到代码调试:一步步教你逆向富斯IBUS协议并移植到STM32F103
  • MC13892电源管理芯片动态特性与引脚设计实战解析
  • 避坑指南:华为AC旁挂组网,Option 43配错导致AP不上线?手把手教你三层发现AC的正确姿势
  • 2026年广告创意公司/医药广告创意代理TOP5榜单:品牌策略与合规传播的破局之道 - 品牌发掘
  • 告别卡顿!从RRC重配置流程看手游/直播为何突然流畅——5G QoS的幕后功臣DRB建立详解
  • Altium Designer 19 自定义库管理实战:解决‘画了找不到’和工具栏消失问题
  • 2026年6月最新版苏州第三方CMACNAS甲醛检测治理机构口碑名单:万清CMA检测中心等5家公司深度测评万清CMA检测中心TOP1推荐 - 一休咨询
  • CloudCompare点云高程归一化保姆级教程:从CSF到泊松重建,四种方法实测对比与避坑指南
  • Python 爬虫项目 Cookie 池搭建与会话隔离实战
  • mysql应用层分表(Application-Level Sharding)知识笔记
  • 多维聚合实战:ROLLUP、CUBE与GROUPING SETS原理与优化
  • 多维聚合中的数据操纵:从OLAP立方体到CEO驾驶舱的四层解剖
  • 从OpenJudge一道题出发,聊聊C++里处理字符串输入的那些“坑”与技巧
  • 不止是列表:用RimWorld的Def系统设计你的第一个原创事件(IncidentDef实战)