zoukankan      html  css  js  c++  java
  • 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
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    ------------------越是喧嚣的世界,越需要宁静的思考------------------ 合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。 积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里;不积小流,无以成江海。骐骥一跃,不能十步;驽马十驾,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也。
  • 相关阅读:
    Linux练习题
    我们普通大学生和国内一流大学的学生差距到底在哪里?
    Python修复图像文件后缀名
    Linux查找/扫描局域网打印机IP
    修改分区后的 Grub rescue
    Linux Matlab mex gcc 版本
    UFLDL新版教程
    Linux之时间、地点、人物、事件、情节
    GMchess Linux下的中国象棋游戏
    Linux 终端 忽略大小写
  • 原文地址:https://www.cnblogs.com/feng9exe/p/14517268.html
Copyright © 2011-2022 走看看