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 并指定根视图控制器
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律