objc_init - ShenYj/ShenYj.github.io GitHub Wiki

应用程序的加载

.

通过设置断点,在调用堆栈处验证:app启动从dyld_dyld_start函数开始

dyld加载流程

dyld(the dynamic link editor)是苹果的动态链接器,是苹果操作系统的重要组成部分,在app被编译打包成可执行文件格式的 Mach-O 文件后,交由dyld负责连接,加载程序

_objc_init

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
}

外链

⚠️ **GitHub.com Fallback** ⚠️