Swift源码解析之弱引用

2020-01-09 00:12:25王冬梅

序言:

各个社区有关 Objective-C weak 机制的实现分析文章有很多,然而 Swift 发布这么长时间以来,有关 ABI 的分析文章一直非常少,似乎也是很多 iOS 开发者未涉及的领域… 本文就从源码层面分析一下 Swift 是如何实现 weak 机制的。

下面话不多说了,来一起看看详细的介绍吧

准备工作

由于 Swift 源码量较大,强烈建议大家把 repo clone 下来,结合源码一起来看这篇文章。


$ git clone https://www.easck.com/pre>

Swift 整个工程采用了 CMake 作为构建工具,如果你想用 Xcode 来打开的话需要先安装 LLVM,然后用 cmake -G 生成 Xcode 项目。

我们这里只是进行源码分析,我就直接用 Visual Studio Code 配合 C/C++ 插件了,同样支持符号跳转、查找引用。另外提醒一下大家,Swift stdlib 里 C++ 代码的类型层次比较复杂,不使用 IDE 辅助阅读起来会相当费劲。

正文

下面我们就正式进入源码分析阶段,首先我们来看一下 Swift 中的对象(class 实例)它的内存布局是怎样的。

HeapObject

我们知道 Objective-C 在 runtime 中通过 objc_object 来表示一个对象,这些类型定义了对象在内存中头部的结构。同样的,在 Swift 中也有类似的结构,那就是 HeapObject,我们来看一下它的定义: