dyld与objc的关联

在上篇文章 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的关联)