App 的启动流程

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、图示

APP 启动.png

解析
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__);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容