App生命周期 | 青训营笔记

131 阅读2分钟

这是我参与「第四届青训营 -IOS场」笔记创作活动的第4篇笔记

iOS App

App的入口

main.m

main函数会初始化一个UIApplication实例以及一个AppDelegate代理

image.png

main函数的关键方法是UIApplicationMain, 官方对它的解释为:

Creates the application object and the application delegate and sets up the event cycle.                                                                       

创建application对象和application代理,设置事件循环。

UIApplicationMain的声明:

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

重点关注后两个参数

  • principalClassName:当传入为nil时,会尝试从info.plist中寻找NSPrincipalClass对应的value, 如果info.plist中也没有,默认为UIApplication。PrincipalClass负责监听app整个生命周期的事件,然后交给delegateClass去处理。

  • delegateClassName:传入 NSStringFromClass([AppDelegate class]), 指定实例化AppDelegate。

所以,可以看到就是传入了两个类,一个principalClass,一个delegateClass, 通过UIApplicationMain()实例化,前者监听事件,后者处理事件。

AppDelegate

AppDelegate是一个单例对象。在App退出前不会被释放。AppDelegate在程序启动时就不断跟踪App的状态变化,当不同状态发生时会回调到不同的函数,处理包括从其他应用跳转、启动应用、后台运行等动作。

App的生命周期

一个App的生命周期包含了5种状态:

  • Not Running
  • Inactive
  • Active
  • Background
  • Suspended

APP在这些状态间的切换,会触发delegateClass中的回调方法。 常用的回调方法有以下7种:

  • application:willFinishLaunchingWithOptions: 在App启动时调用表示应用加载进程已经开始,常用来处理应用状态的存储和恢复
  • application:didFinishLaunchingWithOptions: 表示App将从未运行状态进入运行状态,用于对App的初始化操作
  • applicationDidBecomeActive: 当应用即将进入前台运行时调用
  • applicationWillResignActive: 当应用即将进从前台退出时调用
  • applicationDidEnterBackground: 当应用开始在后台运行的时候调用
  • applicationWillEnterForeground: 当程序从后台将要重新回到前台(但是还没变成Active状态)时候调用
  • applicationWillTerminate: 当前应用即将被终止,在终止前调用的函数。通常是用来保存数据和一些退出前的清理工作。如果应用当前处在suspended,此方法不会被调用。 该方法最长运行时限为5秒,过期应用即被kill掉并且移除内存。