iOS开发之 runtime(36) :load 方法加载

本系列博客是本人的源码阅读笔记,如果有 iOS 开发者在看 runtime 的,欢迎大家多多交流。为了方便讨论,本人新建了一个微信群(iOS技术讨论群),想要加入的,请添加本人微信:zhujinhui207407,【加我前请备注:ios 】,本人博客http://www.kyson.cn 也在不停的更新中,欢迎一起讨论

本文完整版详见笔者小专栏:https://xiaozhuanlan.com/runtime

前言

load 方法中的最后一个函数:

_dyld_objc_notify_register(&map_2_images, load_images, unmap_image);

告诉我们,第一步是 map_2_images,第二步就是 load_images。笔者前面的文章也已经分析过,将文件或者类从 mach-o 里读出来后,进行 remap 等操作后放入相应的 hashmap 中,其实是做了第一步:缓存,为了方便后面调用。而第二步 load_images,则是调用 load 方法。本文将给大家慢慢揭开 load 方法的神秘面纱。

分析

load 方法的实现如下:

void load_images(const char *path __unused, const struct mach_header *mh) {
    if (!hasLoadMethods((const headerType *)mh)) return;
    prepare_load_methods((const headerType *)mh);
    call_load_methods();
}

去掉一些无关逻辑(主要是锁操作和注释)可以看出其实该方法就是两部操作:

  • 调用 load 方法之前的一些准备工作
  • 开始调用 load 方法

大家可能会有一些困惑

  • load 方法之前的 prepare,究竟 prepare 的是什么?为什么要准备?
  • 调用的大概顺序是什么?比如类 A 和 类 A 的父类都实现了 load 方法,甚至还有其 category 都实现了,那顺序是怎么样的?下面笔者带大家抽丝剥茧看代码。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章