属性在对象被释放后自动置为 ,是 Objective-C Runtime(运行时)的一项重要特性。其底层实现原理可以概括为:Runtime 维护了一张全局的 Hash 表(SideTables),用于存储对象地址与指向该对象的所有 weak 指针地址之间的映射关系。 当对象被销毁时,Runtime 会通过这张表找到所有指向该对象的 weak 指针,并将它们指向的内存地址清零(置为 )。 下面是详细的底层实现剖析: 1. 核心数据结构 理解 weak 原理的关键在于理解 Runtime 内部的几个核心结构体: 1. : 这是一个全局的静态数组(哈希数组)。 为了防止多线程竞争导致锁冲突过于频繁,Runtime 使用了“分段锁”技术。 里面包含了多个 结构(通常是 8 个或 64 个,取决于系统架构),通过对象的地址哈希运算后分配到不同的 中。 2. : 包含一个自旋锁(),用于保证线程安全。 包含一个引用计数表()。 核心: 包含一个 (弱引用表)。 3. : 这是一个全局弱引用哈希表。 Key:对象的内存地址(即 出来的那个对象的地址)。 Value: 结构体。 4. : 这是存...