前言
dyld->images->内存->LGPerson(方法-协议)images(macho)->地址->表->类->初始化(rw-ro)
一.objc_init分析
1.environ_init 环境变量打印
打印结果
1.OBJC_DISABLE_NONPOINTER_ISA 不使用NONPOINTER_ISA 举例
打印p的内存 p/t末尾显示1证明是NONPOINTER_ISA
这里设置一下
运行一下 打印
p的内存 p/t末尾显示0证明是POINTER_ISA
2.OBJC_PRINT_LOAD_METHODS 打印所有类使用load的方法
运行一下
3.终端打印环境变量
终端输入export OBJC_HELP=1 输入ls打印如下
2.tls_init 关于线程key的绑定-比如每线程数据的析构函数(后面分析)
3.static_init 运行C++静态构造函数 在dyld调⽤我们的静态构造函数之前,libc 会调⽤ _objc_init(),因此我们必须⾃⼰做
自动调用C++构造函数 先调用系统的
在调用
load的方法
在调用
main函数里面的构造函数
4.runtime_init runtime运⾏时环境初始化,⾥⾯主要是:unattachedCategories,allocatedClasses 后⾯会分析
5.exception_init 初始化libobjc的异常处理系统
调用这个方法
_objc_terminate
uncaught_handler这个方法 底层在哪里注册的
上层API调用的这个方法
6.cache_t::init() 缓存条件初始化
7._imp_implementationWithBlock_init(); 启动回调机制。通常这不会做什么,因为所有的初始化都
8._dyld_objc_notify_register(&map_images, load_images, unmap_image);
&map_images:指针传递 管理⽂件中和动态库中所有的符号(class Protocol selector category)load_images:值拷传递 加载执⾏load⽅法
二.read_images流程引入
1.map_images
调用
map_images_nolock
调用
_read_images 读取镜像文件
三.read_images主体流程
四.readClass核心重点引入
read_images读取镜像文件读取到表里面通过地址还原怎么关联到类里面
读取表里面的
sel和dyld里面的sel进行对比 macho的地址不一定精准 需要修复
五.readClass分析
第一次进入 断点进入之后分析 是先把类添加到表中
通过类的加载我们进入到realizeClassWithoutSwift这个方法