iOS weak的实现原理和销毁过程

2023-07-19  本文已影响0人  阿木小丸子

1.weak的基本用法

weak是弱引用,用weak来修饰、描述所引用的对象计数器并不会增加,而且weak会在引用对象被释放时自动置为nil,这也就避免了野指针访问坏内存而引起奔溃的情况,另外weak也可以解决循环引用。

2.weak实现原理的概括

Runtime维护了一个weak表,用于存储指向某个对象的所有weak指针。weak表其实是一个hash(哈希)表,Key是所指对象的地址,Value是weak指针的地址(这个地址的值是所指对象指针的地址,就是地址的地址)集合(当weak指针的数量小于等于4时,是数组, 超过时,会变成hash表)。

weak的实现原理可以概括一下三步:
struct SideTable {
    // 保证原子操作的自旋锁
    spinlock_t slock;
    // 引用计数的 hash 表
    RefcountMap refcnts;
    // weak 引用全局 hash 表
    weak_table_t weak_table;
}

struct weak_table_t {
    // 保存了所有指向指定对象的 weak 指针
    weak_entry_t *weak_entries;
    // 存储空间
    size_t    num_entries;
    // 参与判断引用计数辅助量
    uintptr_t mask;
    // hash key 最大偏移值
    uintptr_t max_hash_displacement;
};

详细介绍步骤参考:https://www.jianshu.com/p/9dc7ea34bada

上一篇 下一篇

猜你喜欢

热点阅读