在dyld
加载过程当中,咱们知道会调用_objc_init
方法,那么在_objc_init
方法中究竟作了什么呢?咱们来探究下。面试
从_objc_init
实现中咱们分析下该方法主要作了什么缓存
该方法主要是读取运行时的环境变量,咱们能够经过设置DYLD_PRINT_STATISTICS = YES
来打印APP启动到main()函数以前的时长,进而能够进行APP启动优化。具体的environ_init()简介可参考博客iOS-底层原理 16:dyld与objc的关联中有关nviron_init()
部分的介绍app
主要用于关于线程key的绑定,好比每线程数据的析构函数。函数
主要是C++静态构造函数优化
主要是运行时的初始化,主要分为两部分:分类初始化
和类的表初始化
ui
初始化libobjc异常处理this
主要是缓存初始化spa
主要用来启动机制回调线程
主要是dyld
注册 实际代码实现3d
从上文正中咱们能够看出
mapped
即map_images
init
即load_images
unmapped
即unmap_image
从map_images
函数中咱们发现map_images_nolock函数
是重点,咱们进入map_images_nolock
函数
咱们查看代码实现
从截图中咱们能够看出_read_images
是咱们要重点研究的方法
@selector
的错乱问题
readClass
读取出来类的信息
注意
在分类处理中主要是经过load_categories_nolock
处理,咱们进入load_categories_nolock
函数中
load_categories_nolock
函数
从load_categories_nolock
函数实现中,咱们能够看到该函数将类
、实例方法
、协议
、属性
、类方法
等再次连接了一次。
dyld_start
调用_objc_init
来初始化,_objc_init
中经过dyld
调用_dyld_objc_notify_register
函数,传入map_images
跟load_images
这两个参数来处理
map_images
经过map_images_nolock
函数调用_read_images
函数
在_read_images
函数中处理类信息、属性、协议、分类等
当一切准备稳当,则再次返回dyld_start
中,此时dyld
跟objc
关联了起来
若是你正在跳槽或者正准备跳槽不妨动动小手,添加一下我们的交流群1012951431来获取一份详细的大厂面试资料为你的跳槽多添一份保障。