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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
------------------越是喧嚣的世界,越需要宁静的思考------------------ 合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。 积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里;不积小流,无以成江海。骐骥一跃,不能十步;驽马十驾,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也。
原文地址:https://www.cnblogs.com/feng9exe/p/14517268.html