美文网首页
dyld与objc的关联

dyld与objc的关联

作者: 猿人 | 来源:发表于2020-10-19 14:07 被阅读0次

在上篇文章 dyld 了流程分析 中我们大概了解了 程序启动 到main函数之前dyld做了哪些事情
dyld 流程之第8步 【执行初始化方法】 我们也做了具体分析,通过堆栈加源码查看 了解到recursiveInitialization是一个递归函数,初始化各种链接库,库的优先级最高的为libSystem 初始化, libSystem_initializer(libSystem.B.dylib) --> _os_object_init(libdispatch.dylib) --> _objc_init(libobjc.A.dylib) 而 _objc_init函数的调用 里面发现了 _dyld_objc_notify_register , dyld又发现了其接口,固实际上在进行跨库操作 从libobjc库 跨越到 dyld,正好形成了一个闭环,分析dyld接口_dyld_objc_notify_register 得知 notifySingle里面的函数 sNotifyObjCInit 正是 libobjc库中的loadimages 这里也就得出了结论 , dyld 函数recursiveInitialization 调用 初始化 libobjc库并向 自己 注册回调函数 得到libobjc库的函数实现。 在合适的时机 再次调用libobjc的回调函数实现。 下面我们开始分析_objc_init 到底 做了什么事情,以及向dyld注册回调函数剩下的函数是什么也就是 _dyld_objc_notify_registerloadimages 其他的参数

_objc_init (libobjc)

截屏2020-10-19 上午11.16.15.png
  • map_images:dyld 将image镜像文件加载进内存时,会触发该函数
  • load_images:dyld 初始化image会触发该函数
  • unmap_image: dyld将image移除时会触发该函数

_dyld_objc_notify_register(dyld)

从 _dyld_objc_notify_register --> void registerObjCNotifiers(

截屏2020-10-19 上午11.30.21.png

总结

_dyld_objc_notify_register.jpg

map_images 函数实现

map_images 会调用 map_images_nolock方法 下面为精简代码


map_images.jpg

map_images 函数调用 (dyld sNotifyObjCMapped 调用时机)

dyld全局搜索 sNotifyObjcMapped ( registerObjCNotifiers --> notifyBatchPartial --> sNotifyObjCMapped)


2251862-cad06a9820c87f75-2.jpg

由此可以看出 map_images是先于load_images调用,即先map_images ,再load_images
下一篇 类的加载(上)

相关文章

  • dyld与objc的关联

    在本篇文章中,主要探索dyld与objc是如何关联的。 objc_init _objc_init通过dyld的消息...

  • OC底层原理11—dyld与objc的关联

    本文介绍dyld与objc的关联 按照苹果的解释,dyld加载库时,libSystem会调用_objc_init,...

  • dyld与objc的关联

    _objc_init 源码解析 根据源码所知,主要分为以下几部分: environ_init:初始化一系列环境变量...

  • dyld与objc的关联

    在上篇文章 dyld 了流程分析[https://www.jianshu.com/p/b2344b308c14] ...

  • dyld与objc的关联

    _objc_init 源码解析 environ_init方法:环境变量初始化 这些环境变量,均可以通过target...

  • 底层原理:懒加载类与非懒加载类

    上一篇文章我们分析了dyld跟objc的关联中,已经研究到了_dyld_objc_notify_register中...

  • dyld & objc的关联

    抛出问题 上回说到iOS应用程序加载大致流程分析[https://www.jianshu.com/p/ba53fa...

  • iOS - dyld与objc的关联

    本文的主要目的是理解dyld与objc是如何关联的 _objc_init 源码解析 首先,来看下libObjc中的...

  • 十二、dyld 和 Objc 的关联

    主要内容:一、_objc_init 源码分析二、dyld 和 Objc 的关联 一、_objc_init 源码分析...

  • OC底层原理17-类的加载

    前面研究了dyld的加载流程和dyld与objc的关联,我们已经知道,代码会被编译成macho文件,那怎么把mac...

网友评论

      本文标题:dyld与objc的关联

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