_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 variables在Edit Scheme -> Run -> Argments -> Environment Variables 中配置。