SideTable 结构如下
struct SideTable {
spinlock_t slock; ///线程同步锁
RefcountMap refcnts; ///
weak_table_t weak_table; /// weak 散列表 所有 weak 指针存放在这个表里
};
weak_table_t 结构如下
struct weak_table_t {
weak_entry_t *weak_entries; ///指针数组 存放 weak_entry_t 类型
size_t num_entries; ///散列表最大可存放内容容量
uintptr_t mask; /// &mask 可以获取一个 key 从而在散列表快速查找某个元素
uintptr_t max_hash_displacement; ///hash key 最大偏移值
};
#####objc_object::clearDeallocating_slow()
objc_object::clearDeallocating_slow()
{
assert(isa.nonpointer && (isa.weakly_referenced || isa.has_sidetable_rc));
SideTable& table = SideTables()[this];
table.lock(); ///加锁
if (isa.weakly_referenced) { /// 有弱引用指向 就将这个对象的指针置nil
weak_clear_no_lock(&table.weak_table, (id)this);
}
///对 isa 指针的引用技术管理
if (isa.has_sidetable_rc) {
table.refcnts.erase(this);
}
table.unlock(); ///解锁
}