启动加载

48 阅读1分钟

_objc_init

dyld在main函数之前(pre-main)会间接调用到objc的_objc_init

我们在上图可以看出,dyld在main函数之前(pre-main)会间接调用到objc的_objc_init,其中使用_dyld_objc_notify_register注册了3个方法,但在这之前还做了一些初始化的操作。

c++
复制代码
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();
    //绑定线程析构函数
    tls_init();
    //静态构造函数
    static_init();
    //runtime准备,创建2张表
    runtime_init();
    //异常初始化
    exception_init();
#if __OBJC2__
    //缓存
    cache_t::init();
#endif
    //macos专有
    _imp_implementationWithBlock_init();

    _dyld_objc_notify_register(&map_images, load_images, unmap_image);

#if __OBJC2__
    didCallDyldNotifyRegister = true;
#endif
}
environ_init

其中environ_init是读取environment variables的一些配置信息,environment variablesEdit Scheme -> Run -> Argments -> Environment Variables 中配置。