惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Securelist
有赞技术团队
有赞技术团队
WordPress大学
WordPress大学
V
V2EX
Google DeepMind News
Google DeepMind News
B
Blog RSS Feed
The Register - Security
The Register - Security
Recorded Future
Recorded Future
Y
Y Combinator Blog
小众软件
小众软件
Jina AI
Jina AI
V2EX - 技术
V2EX - 技术
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Proofpoint News Feed
Engineering at Meta
Engineering at Meta
宝玉的分享
宝玉的分享
The Hacker News
The Hacker News
C
Cybersecurity and Infrastructure Security Agency CISA
K
Kaspersky official blog
博客园 - 三生石上(FineUI控件)
T
Threatpost
博客园 - 聂微东
Scott Helme
Scott Helme
IT之家
IT之家
N
Netflix TechBlog - Medium
T
The Exploit Database - CXSecurity.com
S
Schneier on Security
MongoDB | Blog
MongoDB | Blog
T
Tor Project blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
A
About on SuperTechFans
酷 壳 – CoolShell
酷 壳 – CoolShell
C
CERT Recently Published Vulnerability Notes
P
Palo Alto Networks Blog
Spread Privacy
Spread Privacy
C
Check Point Blog
L
LINUX DO - 最新话题
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Last Week in AI
Last Week in AI
Attack and Defense Labs
Attack and Defense Labs
T
Tailwind CSS Blog
罗磊的独立博客
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Webroot Blog
Webroot Blog
Help Net Security
Help Net Security
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
爱范儿
爱范儿
PCI Perspectives
PCI Perspectives
Security Latest
Security Latest

木土金王可

复盘 2024,年度好物分享 落地 第二十台相机:宝丽来(Polaroid)Impulse AF 第十九台相机:哈苏(Hasselblad)X1D II 第十八台相机:宝丽来(Polaroid)Macro 5 SLR 第十七台相机:康泰时(Contax)S2 稻荷山 Dave Chappelle: The Closer 语言是思想的边界 对街头卖惨表演的看法 《民主森林》 电梯英雄 2023,年度好物分享 《大画幅 4x5》复活 新加坡华侨银行(OCBC)开户指南 第十六台相机:宾得(Pentax)PC35AF-M SEDATE 第十五台相机:沙慕尼(Chamonix)4x5 F2 Xbox 连接 Studio Display Twitter、Apple、Meta 和 Reddit 广告平台使用体验 第十四台相机:康泰时(Contax)S2 你到底什么时候买相机 拍摄胶片的理由 HomePod 不能作为 Mac 音响 男性生来就是残缺的女性 第十三台相机:柯尼卡(Konica)Big Mini 301 三年,十二台相机 恐怖片很好看啊 比残忍更残忍 用 SwiftUI 重构「行动日」 推荐《女生呵护指南》 你是左派还是右派? 驯服内心的猛犸象:为什么你应该停止关心别人对你的想法 想写点什么,但又不知道该写什么 摄影构图 精致的结婚照 中文没死,是有的人死了 上海爆发 COVID-19 疫情以来我收藏的文章(持续更新) 自我审查 25 美元,成为美国计算机学会(ACM)会员 将同事送我的仙人掌转换成 3D 模型 当我们谈论离屏渲染时,我们在谈论什么 如何让 iOS 给你的应用开后门 二零一九年夏秋之交工作生活的异动 一声一世 iOS 限制输入字数与特殊字符的巧妙方法 对于番茄学习法的误解 Swift 中的空字符串 我如何自学 iOS 开发 为什么我不喜欢社交网络 如何与人见面 为什么我不喜欢即时通讯 以配置信息(UserDefaults)的形式存储应用数据 在文件沙盒中读取与写入应用数据 在 iOS 开发中使用键值对监听(KVO)与通知(Notification) 介绍 GCD 中的线程,队列,延迟执行,线程阻断,信号量,任务组与任务对象 iOS 原生 URLSession 网络请求 在 iOS 开发中使用代理与协议 独立开发的第一个应用:行动日 为什么我会把 Google Pixel 换成 iPhone SE? 手动进行 Nexus 和 Pixel 系列手机的 OTA 更新 开启 Chromebook 的夜间模式
什么是自动引用计数(ARC)和引用循环
kinnouka bokudo · 2018-08-28 · via 木土金王可

ARC 全称 Automatic Reference Counting,中文译名为:自动引用计数。通过 ARC 的机制,当创建一个新对象时,它的引用计数为 1,当有一个新的指针指向这个对象时,其引用计数会自动加 1,当某个指针不再指向这个对象时,其引用计数会自动减 1。当对象的引用计数变为 0 时,说明这个对象不再被任何指针指向,然后系统会自动销毁对象,回收内存。

声明:笔者自身对 ARC 也是初学,而本文介绍的 ARC 知识也都是自己的一些理解,同时尽量不涉及过于原理性的内容,一切以普通工程师实用为目标原则。其中可以想象在很多地方会有理解的错误,还请多包涵。如您发现问题,也往不吝赐教指正,感激不尽。

引用循环

得益于 ARC 的工作,开发者不需要太过于关心内存泄露的问题,但是总有意外情况发生。

想象一下,当两个对象已经不再被需要,但这两个对象相互引用了对方作为自己的成员变量,只有当自己销毁时,才会将成员变量的引用计数减 1。由于这两个对象互相引用,所以他们各自的引用计数都为 1,因此这两个对象永远不会被销毁。这种情况称之为强引用循环(Strong Reference Cycle)

弱引用

想要解决这个问题,可以将引用计数对象之间的引用关系指定为弱引用。如果不手动指定,那所有引用都默认会是强引用。

弱引用不会增加对象的引用计数。此外,弱引用始终为可选类型。这意味着当引用计数变为零时,引用可以自动设置为 nil

具体的实现方法就是,在成员变量前加上 weak 修饰符。

无主引用

无主引用也是弱引用,它与弱引用的区别就在于弱引用始终是可选的,并且在引用的对象取消初始化时会自动变为 nil。这就是为什么必须将弱引用的成员变量定义为可选 var类型(因为变量需要更改)。

而无主引用不是可选类型。如果尝试访问已取消初始化对象的无主引用的成员变量,则会触发强制解包 nil 的错误。

与闭包有关的引用循环

当成员变量相互引用时,会出现对象内部的引用循环。与对象一样,闭包也是引用类型,所以也可能会导致循环。

由于闭包对使用它们的对象有一个强引用,所以如果对象对闭包有一个强引用,同时在闭包的代码块中又对该对象本身有一个强引用(比如 self),那这样就会引起引用循环。

解决这个这个问题的方式就是,在闭包内部使用 [unowned self] in 语句,这样就将闭包内部对对象的引用变为弱引用。但是需要注意的是,如果在调用闭包的时候,对象已经被释放的话,会出现错误。或者是使用 [weak self] in 语句,那在闭包内部的 self将变为可选值。

但是这样仍然没有解决在调用闭包时,对象被释放的错误,想要解决这个错误就需要在闭包内部将对对象的应用重新变为强引用,而避免对象在执行过程中被释放。

…{ [weak self] in
    guard let self = self else { return }
    self.somefunc()
}

这种做法的名称为 Weak-Strong Dance,从而就保证了对象在执行过程中不会被释放。

2018 年 8 月 28 日