美文网首页ios底层原理
ios应用程序加载分析(二)

ios应用程序加载分析(二)

作者: erlich | 来源:发表于2022-07-05 22:28 被阅读0次

    为了不至于分析链条发生断层,请参阅ios应用程序加载分析(一)

    _dyld_objc_notify_register ---- sNotifyObjcInit 是如何关联上的

    sNotifyObjcInit 分析源头

    image.png image.png image.png image.png image.png image.png
    以上源码出自于dyld
    
    image.png

    上一段源码出自于libobjc, libdyld与libobjc通过_dyld_objc_notify_register架起桥梁

    image.png image.png
    回到加载流程图
    
    image.png image.png image.png image.png image.png
    与 libSystem_initializer 衔接上,此时缺口补上
    

    map_images()镜像文件类的信息 class ro rw protocols 处理

    根据以上分析得到句柄出处 sNotifyObjcInit
    
    image.png image.png image.png image.png

    arr_init()

    • SideTablesMap.init(); 初始化散列表

    • _objc_associations_init(); 关联对象管理 初始化

    • startWeakTableScan(); 扫描若引用

    image.png

    修复selector

    image.png image.png

    Fix up old objc_msgSend_fixup call sites

    image.png image.png

    实现 (有实现+load方法)的类

    image.png

    load_images() load方法 - c++函数 + load + main

    +load
    
    image.png image.png image.png image.png
    c++
    
    image.png image.png image.png

    镜像内的 c++方法 晚于 +load执行,objc镜像内的 c++方法 早于 +load执行 最后main

    image.png

    类加载主干流程总结

    image.png

    _dyld_objc_notify_register 之前,执行 static_init()

    也就是objc镜像内的 attribute((constructor)) 修饰的c++函数会先执行

    load_images 执行之后 -> doModInitFunctions, 执行 目标镜像 attribute((constructor)) 修饰的c++函数

    相关文章

      网友评论

        本文标题:ios应用程序加载分析(二)

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