objc_init - ShenYj/ShenYj.github.io GitHub Wiki
通过设置断点,在调用堆栈处验证:app启动从dyld
的_dyld_start
函数开始
dyld
(the dynamic link editor)是苹果的动态链接器,是苹果操作系统的重要组成部分,在app被编译打包成可执行文件格式的 Mach-O 文件后,交由dyld
负责连接,加载程序
objc-os.mm
中源码
void _objc_init(void)
{
static bool initialized = false;
if (initialized) return;
initialized = true;
// fixme defer initialization until an objc-using image is found?
// 读取影响运行时的环境变量。如果需要,还可以打印环境变量帮助
environ_init();
// 关于线程key的绑定,比如:线程数据的析构函数
// 主要作用是: 本地线程池的初始化和析构
tls_init();
// 运行C++静态构造函数。在dyld调用我们的静态构造函数之前,libc 会调用 _objc_init()
static_init();
// runtime运行时环境初始化
runtime_init();
// libobjc异常处理系统初始化
exception_init();
// 缓存条件初始化
cache_init();
// 启动回调机制。通常不会做什么,因为所有的初始化都是惰性的
_imp_implementationWithBlock_init();
/*
_dyld_objc_notify_register -- dyld 注册的地方
- 仅供objc运行时使用
- 注册处理程序,以便在映射、取消映射 和初始化objc镜像文件时使用,dyld将使用包含objc_image_info的镜像文件数组,回调 mapped 函数
map_images:dyld将image镜像文件加载进内存时,会触发该函数
load_images:dyld初始化image会触发该函数
unmap_image:dyld将image移除时会触发该函数
*/
_dyld_objc_notify_register(&map_images, load_images, unmap_image);
#if __OBJC2__
didCallDyldNotifyRegister = true;
#endif
}