NSObject的释放--object_cxxDestruct 释放成员变量

NSObject的释放

通过runtime源码,很清晰的可以看,NSObject调用dealloc后产生函数调用链如下:
dealloc --> objc_rootDealloc -->objc_dispose -->objc_destructInstance
最终调用了一个objc_destructInstance函数,这个函数的定义如下:

void *objc_destructInstance(id obj) {
    if (obj) {
        Class isa_gen = _object_getClass(obj);
        class_t *isa = newcls(isa_gen);

        // Read all of the flags at once for performance.
        bool cxx = hasCxxStructors(isa);
        bool assoc = !UseGC && _class_instancesHaveAssociatedObjects(isa_gen);

        //这里是重点
        if (cxx) object_cxxDestruct(obj);
        if (assoc) _object_remove_assocations(obj);

        if (!UseGC) objc_clear_deallocating(obj);
    }

    return obj;
}

在objc_destructInstance函数中,我们可以看到这里面做了三件事情:
(1)object_cxxDestruct 做一些释放相关的操作
(2)_object_remove_assocations:移除对象的关联对象,也就是说对象的关联对象是在objc_destructInstance函数中释放的。(具体是如何执行关联对象的释放,后续我们还会讲到)
(3)objc_clear_deallocating:清空引用计数表和弱引用表,并将所有的weak引用置为nil。(也就是我们的weak引用在dealloc后能够自动置为nil是因为在这里执行了置为nil的操作)



作者:好雨知时节浩宇
链接:https://www.jianshu.com/p/eec3fb94b2e6
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
posted @ 2021-03-11 13:15  zzfx  阅读(255)  评论(0编辑  收藏  举报