返回

深入浅析 Objective-C 源码:揭秘弱类型指针的奥秘

IOS



Objective-C 语言中,weak 类型指针是一种特殊类型的指针,用于处理对象生命周期管理。与强引用指针不同,weak 类型指针不会阻止对象被释放,从而避免了循环引用带来的内存泄漏问题。

在 Objective-C 源码中,weak 类型指针的实现位于 `objc-runtime.h` 头文件中。`weak_entry_t` 结构体定义如下:

struct weak_entry_t {
void *value;
weak_entry_t *next;
};


`weak_entry_t` 结构体包含两个成员:`value` 和 `next`。`value` 成员指向被弱引用的对象,`next` 成员指向指向同一对象的下一个 `weak_entry_t` 结构体。

weak 类型指针的实现依赖于哈希表。每个对象都有一个对应的哈希桶,用于存储指向该对象的 weak 类型指针。哈希桶由 `weak_table_t` 结构体表示:

struct weak_table_t {
weak_entry_t **buckets;
uint32_t capacity;
uint32_t count;
};


`weak_table_t` 结构体包含三个成员:`buckets`、`capacity` 和 `count`。`buckets` 成员指向一个数组,数组中的每个元素是一个哈希桶。`capacity` 成员表示数组的容量,`count` 成员表示数组中已使用的哈希桶数量。

当创建一个 weak 类型指针时,Objective-C 运行时会执行以下步骤:

1. 计算对象的哈希值。
2. 根据哈希值找到对应的哈希桶。
3. 在哈希桶中创建一个 `weak_entry_t` 结构体,指向被弱引用的对象。
4. 将 `weak_entry_t` 结构体添加到哈希桶中。

当对象被释放时,Objective-C 运行时会执行以下步骤:

1. 计算对象的哈希值。
2. 根据哈希值找到对应的哈希桶。
3. 遍历哈希桶,找到指向该对象的 `weak_entry_t` 结构体。
4. 将指向对象的 `weak_entry_t` 结构体从哈希桶中删除。
5. 释放 `weak_entry_t` 结构体。

weak 类型指针的实现非常巧妙,它使用哈希表来高效地管理指向对象的指针,同时避免了循环引用带来的内存泄漏问题。