生命周期
应用(App)的生命周期
-
通常定义在AppDelegate中, 包括:
- application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) app启动后即调用,存活期只调用这一次。
- applicationWillResignActive(_ application: UIApplication) app失去焦点时调用,比如来电话了或者刚按下home键,或者拉下控制中心,或者进入应用切换器,app处于暂停状态,即将进入后台但并不是一定会进入后台。
- applicationDidEnterBackground(_ application: UIApplication) app已经进入后台,此时可以释放一些资源,存储一些用来恢复的用户信息等。
- applicationWillEnterForeground(_ application: UIApplication) app即将进入前台,调用它的前提是app之前已经进入后台。
- applicationDidBecomeActive(_ application: UIApplication) app已经恢复,可以从已进入后台中经过EnterForeground后恢复,也可以从失去焦点后恢复,值得注意的是app在启动时也会调用一次这个函数。
- applicationWillTerminate(_ application: UIApplication) app结束时调用,比如从应用管理器杀掉app。
-
iOS 13之后多了一个Scene(场景)的概念,很多有关场景的生命周期定义在SceneDelegate中:
- func scene(_:willConnectTo:options:) 将场景添加到app时调用,类似于appdelegate中的didFinishLaunchingWithOptions。
- sceneDidDisconnect(_:) 当场景与app断开连接是调用(注意,以后它可能被重新连接)。
- sceneDidBecomeActive(_:) 对应上面的BecomeActive,当用户开始与场景进行交互(例如从应用切换器中选择场景)时,会调用。
- sceneWillResignActive(_:) 对应上面的ResignActive,当用户停止与场景交互(例如通过切换器切换到另一个场景)时调用。
- sceneWillEnterForeground(_:) 对应上面的EnterForeground,,即从后台状态变成开始或恢复状态。
- sceneDidEnterBackground(_:) 对应上面的EnterBackground,当场景进入后台时调用,即该应用已最小化但仍存活在后台中。
- 与此同时,appDelegate中多了有关session管理的代理函数: + application(:configurationForConnecting:options:), 会返回一个创建场景时需要的UISceneConfiguration对象。 + application(:didDiscardSceneSessions:), 当用户通过“应用切换器”关闭一个或多个场景时会被调用。
页面(ViewController)的生命周期
调用的顺序如下:
- viewDidLoad() 页面加载函数
- viewWillAppear() 页面即将显示
- viewWillLayoutSubviews() 页面中布局即将发生变化
- viewDidLayoutSubviews() 页面中布局已经变化
- viewDidAppear() 页面已经显示
- viewWillDisappear() 页面即将离开
- viewDidDisappear() 页面已经离开
- didReceiveMemoryWarning 收到内存警告
- deinit 页面已销毁
当发生由VC1 push 到VC2 时,顺序如下
- vc2 didload
- vc1 willdisappear
- vc2 willappear
- vc2 willlayoutsubviews
- vc2 didlayoutsubviews
- may have vc1 willlayoutsubviews & didlayoutsubviews
- vc1 diddisappear
- vc2 didappear
此时,如果再从vc2 pop回 vc1, 顺序如下:
- vc2 willdisappear
- vc1 willappear
- vc1 willlayoutsubviews
- vc1 didlayoutsubviews
- vc2 diddisappear
- vc1 didappear
- vc2 deinit(如果不存在内存泄漏,正常是会销毁的)