0%

Runtime:weak

当一个对象被weak指针指向时,这个weak指针会以对象作为key,存储到SideTable的weak_table哈希表中。

  • Key:对象
  • Value:weak指针数组

当该对象dealloc方法被调用时,Runtime会以该对象为key,从SideTable的weak_table哈希表中,找到对应的weak指针列表,然后吧其中的weak指针逐个置为nil。

底层细节

使用weak修饰的对象,底层调用了objc_initWeak函数。里面获取weak指针地址和对象地址传递到下一层函数存储。最终存储到SideTable中的weak_table哈希表。

1
2
3
4
5
6
7
8
9
10
11
12
struct SideTable {
spinlock_t slock; // 锁
RefcountMap refcnts; // 指向对象引用计数的哈希表(仅在未开启isa优化或在isa优化下isa_t引用计数溢出时才会用到)
weak_table_t weak_table; // 存储对象若引用指针的哈希表
}

struct weak_table_t {
weak_entry_t *weak_entries; // 用于存储哈希数组
size_t num_entries;
uintptr_t mask;
uintptr_t max_hash_displacement;
};
aUBSTV

参考

欢迎关注我的其它发布渠道