美文网首页
被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