iOS基础 - APP启动流程

▶ 程序入口:main 函数

1 - 任何一个程序,无论是基于 Mac OS 还是 iOS,程序都是从 main 函数开始执行的。main 函数仅在最小程度上地被使用,而应用程序大多数所做的工作均由 UIApplicationMain 函数来处理!main 函数只做 2 件事

① 创建、释放自动释放池

② 调用 UIApplicationMain 函数

1 int main(int argc, char * argv[]){
2  @autoreleasepool {// 自动释放池
3 
4    return UIApplicationMain(argc, argv, nil,NSStringFromClass([AppDelegate class]));// 执行 UIApplicationMain 函数时转接到了 AppDelete 中
5  }
6 } 

▶ UIApplicationMain

1 - UIApplicationMain 主要实现了 3 个功能

① 创建应用程序实例

② 创建应用程序代理实例

③ 建立事件循环 RunLoop(是个死循环:不断检测程序运行状态,捕捉是否被触摸、晃动等事件)

2 - UIApplicationMain 函数接受四个参数,并将它们用于初始化程序,缺省值不需要手动修改

int UIApplicationMain (int argc,char *argv[], NSString *principalClassName,NSString *delegateClassName);

① 参数 argc 和 argv 是 ISO C 标准的 main 函数参数,直接传递给 UIApplicationMain 进行相关处理

② principalClassName 应用程序对象所属的类名:该类必须继承于 UIApplication!如果所属类字符串的值为 nil,UIKit 缺省使用 UIApplication

③ delegateClassName 应用程序类的代理类名:该函数根据 delegateClassName 创建一个 delegate 对象,并将 UIApplication 对象中的 delegate 属性设置为 delegate 对象。如果设置为 nil,UIKit 就会将应用程序主 nib 文件中的某个对象假定为应用程序的委托对象

④ UIApplicationMain 根据上述两个类名创建应用程序实例、应用程序代理实例,建立事件循环 RunLoop,检测程序的各种事件。虽然这个方法标明为返回一个 int,但是其实它并不会真正返回,它会一直存在于内存中,直到用户或者系统将其强制终止

▶ UIApplication

1 - 应用程序在 iPhone 中用 UIApplication 实例表示(它是单例),就是说每个应用程序都是 UIApplication 或其子类实例

2 - UIApplication 主要用于处理用户事件以及负责 Window 的显示,它通常会给应用程序指定一个委托来监测程序的运行

▶ UIApplicationDelegate

1 - 主要检测应用程序的状态并做出相应的处理:应用程序的状态有很多,如:程序启动、进入活跃状态、进到后台、内存警告、收到远程消息等等

2 - 任何接受了 UIApplicationDelegate 协议的对象都可以成为应用程序代理,旦应用程序的某种状态触发,就会执行相应的代理方法

3 - UIApplicationDelegate 是一个 OC 的协议。里面声明了一堆方法,这些方法都与应用程序运行状态有关,它们由应用程序代理实现,其重要责任就是监控应用程序的告急行为

由 UIApplication 对象负责调用方法如下

代码示例:监听应用程序的活跃状态

复制代码
 1 #import "AppDelegate.h"
 2 #import "ViewController.h"
 3 @interface AppDelegate ()
 4 
 5 @end
 6 
 7 @implementation AppDelegate
 8 
 9 // APP 已经完成启动
10 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
11 
12     NSLog(@"%s,%d",__FUNCTION__,__LINE__);
13     
14     self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
15     self.window.backgroundColor = [UIColor whiteColor];
16     [self.window makeKeyAndVisible];
17     ViewController * rootVC =[[ViewController alloc] init];
18     self.window.rootViewController = rootVC;
19 
20     return YES;
21 }
22 
23 // 将要取消活跃状态
24 - (void)applicationWillResignActive:(UIApplication *)application {
25 
26      NSLog(@"%s,%d",__FUNCTION__,__LINE__);
27 }
28 
29 // 已经进入后台
30 - (void)applicationDidEnterBackground:(UIApplication *)application {
31 
32     NSLog(@"%s,%d",__FUNCTION__,__LINE__);
33 }
34 
35 // 将要进入前台
36 - (void)applicationWillEnterForeground:(UIApplication *)application {
37 
38     NSLog(@"%s,%d",__FUNCTION__,__LINE__);
39 }
40 
41 // 已经变为活跃状态
42 - (void)applicationDidBecomeActive:(UIApplication *)application {
43 
44     NSLog(@"%s,%d",__FUNCTION__,__LINE__);
45 }
46 
47 // 将要关闭程序
48 - (void)applicationWillTerminate:(UIApplication *)application {
49 
50     NSLog(@"%s,%d",__FUNCTION__,__LINE__);
51 }
52 
53 @end
复制代码

日志信息

场景 A:Command + r 运行程序

场景 B:Command + Shift + h 进入后台

场景 C:从后台中点击应用图标,进入程序

场景 D:Command + Shift + 双击 h:挂起

场景 E:在挂起状态中点击应用,进入程序

场景 F:进入挂起状态,并杀掉进程(红色箭头是程序挂起时触发;绿色箭头是程序自挂起状态杀掉进程后所触发)

▶ 小结

1 - APP 启动流程如下

① main.m 函数是程序的入口

② 执行 UIApplicationMain 函数,在其中创建程序对象、指定委托(监测程序、开启事件循环、处理事件)

③ UIApplicationDelegate 方法开始执行

④ 加载 Window 并指定根视图控制器

posted on   低头捡石頭  阅读(25)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示