1、pre-main 阶段(系统主导)
1、加载 Mach-O 可执行文件;
2、dyld 库加载;
3、Runtime 初始化;
1、加载 Mach-O 可执行文件
1、内核将应用的 Mach-O 文件(包含代码、数据等)加载到内存中。
2、验证文件签名和完整性。
2、dyld 加载
dyld(dynamic link editor)Apple 的动态链接器,可以用来装载 Mach-O 文件(可执行文件、动态库等)。dyld 所做的事情如下:
1、启动 APP 时,dyld 会先装载 APP 的可执行文件。
2、再递归加载所有依赖的动态库。
3、合并符号表,rebase/bind 符号。
以上完成后,会通知 Runtime 进行下一步的处理。
3、Runtime 初始化
1、Runtime 会调用 map_images 进行可执行文件内容的解析和处理。
2、在 load_images 中调用 call_load_methods,调用所有 Class 和 Category 的 +load 方法。
3、进行各种 objc 结构的初始化,注册所有 Objective-C 类、分类(Category)、方法列表、协议等元数据,建立类继承关系和消息转发机制。
4、调用 C++ 静态初始化器和 attribute((constructor)) 修饰的函数。
到此为止,可执行文件和动态库中所有的符号(Class,Protocol,Selector,IMP,…)都已经按格式成功加载到内存中,被 Runtime 所管理。
4、小结
1、APP 的启动由 dyld
主导,将可执行文件
加载到内存,并加载所有依赖的动态库
。
2、由 Runtime
负责加载 objc
定义的结构。
3、所有初始化工作结束后,dyld
就会调用 main
函数。
2、Main 函数阶段
1、调用 UIApplicationMain 函数
创建 UIApplication 单例(应用核心控制器);实例化 AppDelegate/SceneDelegate。
2、RunLoop 初始化
初始化主线程 RunLoop(尚未启动);配置事件源(Source0/Source1/Timers)。
3、Main 函数执行后阶段(应用主导)
Appdelegate 的 didFinishLaunchingWithOptions 方法。
1、应用初始化
1、生命周期回调:配置全局服务(日志、统计、推送等),初始化核心数据模型。
2、UI 层级构建:创建 UIWindow 并设置根视图控制器,触发视图控制器链。
2、首帧渲染
1、首帧布局与绘制。
2、RunLoop 启动:主线程 RunLoop 正式运行,事件循环处理。
3、运行事件响应链
UIApplication -> UIWindow -> RootVC -> subView1...
4、图示
解析
1、程序入口
进入 main 函数,设置 AppDelegate 为函数的代理。
2、程序完成加载
[AppDelegate application:didFinishLaunchingWithOptions:]
3、创建 window 窗口
4、程序被激活
[AppDelegate applicationDidBecomeActive:]
5、当点击 command+H 时(针对模拟器,手机是当点击 home 键)
程序取消激活状态
[AppDelegate applicationWillResignActive:];
程序进入后台
[AppDelegate applicationDidEnterBackground:];
6、点击进入工程
程序进入前台
[AppDelegate applicationWillEnterForeground:]
程序被激活
[AppDelegate applicationDidBecomeActive:];
控制器的生命周期
// 非storyBoard(xib或非xib)都走这个方法
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
NSLog(@"%s", __FUNCTION__);
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
}
return self;
}
// 如果连接了串联图storyBoard 走这个方法
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
NSLog(@"%s", __FUNCTION__);
if (self = [super initWithCoder:aDecoder]) {
}
return self;
}
// xib 加载 完成
- (void)awakeFromNib {
[super awakeFromNib];
NSLog(@"%s", __FUNCTION__);
}
// 加载视图(默认从nib)
- (void)loadView {
NSLog(@"%s", __FUNCTION__);
self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.view.backgroundColor = [UIColor redColor];
}
//视图控制器中的视图加载完成,viewController自带的view加载完成
- (void)viewDidLoad {
NSLog(@"%s", __FUNCTION__);
[super viewDidLoad];
}
//视图将要出现
- (void)viewWillAppear:(BOOL)animated {
NSLog(@"%s", __FUNCTION__);
[super viewWillAppear:animated];
}
// view 即将布局其 Subviews
- (void)viewWillLayoutSubviews {
NSLog(@"%s", __FUNCTION__);
[super viewWillLayoutSubviews];
}
// view 已经布局其 Subviews
- (void)viewDidLayoutSubviews {
NSLog(@"%s", __FUNCTION__);
[super viewDidLayoutSubviews];
}
//视图已经出现
- (void)viewDidAppear:(BOOL)animated {
NSLog(@"%s", __FUNCTION__);
[super viewDidAppear:animated];
}
//视图将要消失
- (void)viewWillDisappear:(BOOL)animated {
NSLog(@"%s", __FUNCTION__);
[super viewWillDisappear:animated];
}
//视图已经消失
- (void)viewDidDisappear:(BOOL)animated {
NSLog(@"%s", __FUNCTION__);
[super viewDidDisappear:animated];
}
//出现内存警告 //模拟内存警告:点击模拟器->hardware-> Simulate Memory Warning
- (void)didReceiveMemoryWarning {
NSLog(@"%s", __FUNCTION__);
[super didReceiveMemoryWarning];
}
// 视图被销毁
- (void)dealloc {
NSLog(@"%s", __FUNCTION__);
}