美文网首页
从dyld过程看类、分类、ro、rwe

从dyld过程看类、分类、ro、rwe

作者: 改变1 | 来源:发表于2022-12-07 17:38 被阅读0次

整个app从点击到执行到系统main函数之前的过程图


dyld流程分析图.png

但今天主要记录的是notify_register函数之后的执行


image.png
load_images
作⽤:执⾏类和分类的 load ⽅法,如果类实现了load方法,此时就会进行加载

load⽅法总结
1.当⽗类和⼦类都实现load函数时,⽗类的load⽅法执⾏顺序要优先于⼦类
2.当⼀个类未实现load⽅法时,不会调⽤⽗类load⽅法
3.类中的load⽅法执⾏顺序要优先于分类(Category)
4.load⽅法使⽤了锁,所以是线程安全的。
5.当有多个类别(Category)都实现了load⽅法,这⼏个load⽅法都会执⾏,但执⾏顺序不确定(其执⾏顺序与类别在Compile Sources中出现的顺序⼀致)
6.当然当有多个不同的类的时候,每个类load 执⾏顺序与其在Compile Sources出现的顺序⼀致
map_images
作⽤:进⾏类的初始化。
关键函数 read_images 流程
1: 加载所有类到类的表中。
2: 对所有类做重映射。
3: 将所有SEL都注册到namedSelectors表中。
4: 修复函数指针遗留。
5: 将所有Protocol都添加到protocol_map表中。
6: 对所有Protocol做重映射。
7: 初始化所有⾮懒加载的类,进⾏rw、ro等操作。
8:遍历已标记的懒加载的类,并做初始化操作。
9:处理所有Category,包括Class和Meta Class。
10:初始化所有未初始化的类。
在源码的dyld中对于各类可变更区域和不可变的生效分配也在此进行了


image.png
在此可以看到,系统在加载类的时候,如果分类为非懒加载模式,比如有实现load方法等,在此时就会直接开辟rew可动态修改类区域。否则都暂时存储在rw中,等遇到具体场景的时候,再重新开辟rew
类和分类是否为懒加载,dyld加载期间的具体情况
image.png

相关文章

  • iOS底层原理16:dyld源码分析

    本文主要介绍dyld源码执行流程,应用启动加载过程、类、分类加载,都不可避免的触及dyld,所以了解dyld源码可...

  • 类的加载原理(中)

    realizeClassWithoutSwift引入 如何找到执行class的rw、ro、rwe操作入口 通过最直...

  • iOS class_ro_t和class_rw_t的区别 cat

    本文主要介绍class_ro_t和class_rw_t的区别、分类加载过程以及多个分类加载的问题 class_ro...

  • iOS---12-load_images&类拓展&关联对象原理分

    类扩展 分类 类扩展就是一个匿名的分类.类扩展在编译的时候就将数据写入到类的信息中,也就ro中 分类编译底层是st...

  • 470.class_ro_t 和 class_rw_t 的区别

    class_ro_t class_ro_t存储了当前类在编译期就已经确定的属性、方法以及遵循的协议,里面是没有分类...

  • iOS-分类重写原方法,如何调用原方法

    需要知识 class_ro ,class_rw 分类中重写了原类方法导致原类中的方法被覆盖了,category的底...

  • 类与分类搭配加载分析

    OC类与分类搭配加载分析 dyld加载数据,数据到底是怎么读取出来的? 类信息非常重要的方法 1.readClas...

  • 类的加载原理(下)

    WWDC感受类的加载 在类的加载的时候最终都会走到methodizeClass方法,此函数内有一段获取rwe的操作...

  • APP启动

    启动分为2种:冷启动和热启动。 启动的时间分为两部分:main函数执行之前(加载dyld,加载类文件,协议,分类,...

  • RWD & RWE

    不知道大家最近几年是不是经常听到RWD(真实世界数据)和RWE(真实世界证据),还有一个RWS(真实世界研究)。说...

网友评论

      本文标题:从dyld过程看类、分类、ro、rwe

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