揭秘OC App加载启动的秘密
2023-11-26 15:09:07
OC应用程序加载启动的秘密大揭秘
一、冷启动后main函数前奏:初探启动流程
iOS应用程序启动并非直接从main函数开始,其背后暗藏着漫长的启动过程。为了探究这一过程,我们新建一个iOS项目,并在AppDelegate中添加一段调试输出:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"%s", __func__);
return YES;
}
运行项目,控制台输出如下:
-[_SwiftInit_0323949579_iPhone_25_1_6 application:didFinishLaunchingWithOptions:]
从中可见,在main函数执行之前,应用程序已经执行了-[SwiftInit_0323949579_iPhone_25_1_6 application:didFinishLaunchingWithOptions:]
方法。这个神秘的方法又是从何而来?
二、揭开dyld4加载进程的面纱
在main函数执行之前,应用程序会经历一个名为dyld4的动态链接器加载过程。dyld4是iOS系统的重要组件,负责将应用程序可执行文件(.app)载入内存,解析其符号表,并为应用程序的代码、数据和资源文件分配内存空间。
dyld4的加载过程可分为以下步骤:
- 加载应用程序可执行文件 :从磁盘加载应用程序二进制文件到内存。
- 解析应用程序符号表 :识别应用程序中所有符号(函数、变量、类等)及其在内存中的地址。
- 加载应用程序代码段 :将应用程序可执行代码从磁盘加载到内存中。
- 加载应用程序数据段 :将应用程序可初始化数据和未初始化数据从磁盘加载到内存中。
- 加载应用程序资源文件 :将应用程序中包含的图片、音效、数据文件等资源从磁盘加载到内存中。
dyld4加载过程完成后,应用程序便已准备就绪,等待执行。
三、Symbol Resolution:解析符号引用
在dyld4加载应用程序的过程中,会遇到一些符号引用,它们指向应用程序中其他模块或库中的函数或变量。为了让应用程序正确运行,dyld4需要对这些符号引用进行解析,也就是Symbol Resolution。
Symbol Resolution的过程可分为以下步骤:
- 查找符号引用的目标模块或库 :通过符号表和应用程序的依赖关系确定符号引用的归属。
- 加载目标模块或库 :如果目标模块或库尚未加载,则将其加载到内存中。
- 解析符号引用的目标函数或变量 :在目标模块或库中找到符号引用的目标函数或变量。
- 更新符号表中的地址 :将符号引用的目标函数或变量的地址更新到符号表中,供应用程序使用。
Symbol Resolution完成后,应用程序便能正确执行,无需担心符号引用错误。
四、main函数的登场:应用程序的入口
应用程序加载完成并完成Symbol Resolution后,便可执行main函数。main函数是应用程序的入口函数,应用程序从这里开始执行。
main函数的执行过程可分为以下步骤:
- 调用UIApplicationMain函数 :这个函数是应用程序的实际入口点。
- 创建应用程序委托(AppDelegate)对象 :AppDelegate是应用程序生命周期管理的核心类。
- 调用应用程序委托对象的application:didFinishLaunchingWithOptions: 方法:这个方法是应用程序启动时的入口点,负责应用程序启动后执行的初始化工作。
- 开始应用程序的事件循环 :应用程序将进入一个事件循环,响应用户输入和系统事件。
至此,OC应用程序加载启动的过程便告一段落。
总结
OC应用程序的加载启动过程是一个复杂而精密的进程,涉及动态链接器dyld4、符号解析Symbol Resolution和应用程序委托AppDelegate等关键组件。理解这一过程有助于我们深入了解应用程序的内部机制,优化启动性能,提升用户体验。
常见问题解答
-
为什么main函数不是应用程序的直接入口点?
为了在应用程序执行之前完成必要的加载和初始化工作,包括加载应用程序代码、数据和资源,解析符号引用等。 -
Symbol Resolution是什么?
Symbol Resolution是解析应用程序符号引用,找到它们在内存中的实际地址的过程。 -
dyld4在应用程序启动过程中扮演什么角色?
dyld4是iOS系统的动态链接器,负责加载应用程序的可执行文件、解析符号表并为应用程序的代码、数据和资源分配内存空间。 -
AppDelegate在应用程序启动过程中做什么?
AppDelegate是应用程序委托类,负责管理应用程序的生命周期,包括启动、进入后台、进入前台和终止等事件。 -
应用程序的启动过程如何影响性能?
应用程序的启动时间会受到加载时间、符号解析效率和应用程序代码复杂度等因素的影响。优化这些因素有助于缩短启动时间,提升用户体验。