美文网首页
被weak修饰的对象在被释放的时候会发生什么?是如何实现的?知道

被weak修饰的对象在被释放的时候会发生什么?是如何实现的?知道

作者: 晴川历历汉阳树丶 | 来源:发表于2020-05-11 15:45 被阅读0次
被weak修饰的对象在被释放的时候会发生什么?

1.被weak修饰的对象在释放时,weak指针会自动被置为nil。

是如何实现的?

2.系统会把那些被用weak修饰的对象放到一张hash表中,地址为key。在对象被释放之后,通过自身的地址去hash表中找到对应的对象并释放掉,然后将weak指针置为nil。

知道sideTable么?里面的结构可以画出来么?

3.sideTable里有一个操作SideTable时用到的锁、引用计数的值、存weak指针的hash表。

iOS源码:
struct SideTable {
    spinlock_t slock;//操作SideTable时用到的锁
    RefcountMap refcnts;//引用计数的值
    weak_table_t weak_table;//存weak指针的hash表

    SideTable() {
        memset(&weak_table, 0, sizeof(weak_table));
    }

    ~SideTable() {
        _objc_fatal("Do not delete SideTable.");
    }

    void lock() { slock.lock(); }
    void unlock() { slock.unlock(); }
    void forceReset() { slock.forceReset(); }

    // Address-ordered lock discipline for a pair of side tables.

    template<HaveOld, HaveNew>
    static void lockTwo(SideTable *lock1, SideTable *lock2);
    template<HaveOld, HaveNew>
    static void unlockTwo(SideTable *lock1, SideTable *lock2);
};

相关文章

网友评论

      本文标题:被weak修饰的对象在被释放的时候会发生什么?是如何实现的?知道

      本文链接:https://www.haomeiwen.com/subject/lzvunhtx.html