生命周期

应用(App)的生命周期
  • 通常定义在AppDelegate中, 包括:

    1. application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) app启动后即调用,存活期只调用这一次。
    2. applicationWillResignActive(_ application: UIApplication) app失去焦点时调用,比如来电话了或者刚按下home键,或者拉下控制中心,或者进入应用切换器,app处于暂停状态,即将进入后台但并不是一定会进入后台。
    3. applicationDidEnterBackground(_ application: UIApplication) app已经进入后台,此时可以释放一些资源,存储一些用来恢复的用户信息等。
    4. applicationWillEnterForeground(_ application: UIApplication) app即将进入前台,调用它的前提是app之前已经进入后台。
    5. applicationDidBecomeActive(_ application: UIApplication) app已经恢复,可以从已进入后台中经过EnterForeground后恢复,也可以从失去焦点后恢复,值得注意的是app在启动时也会调用一次这个函数。
    6. applicationWillTerminate(_ application: UIApplication) app结束时调用,比如从应用管理器杀掉app。
  • iOS 13之后多了一个Scene(场景)的概念,很多有关场景的生命周期定义在SceneDelegate中:

    1. func scene(_:willConnectTo:options:) 将场景添加到app时调用,类似于appdelegate中的didFinishLaunchingWithOptions。
    2. sceneDidDisconnect(_:) 当场景与app断开连接是调用(注意,以后它可能被重新连接)。
    3. sceneDidBecomeActive(_:) 对应上面的BecomeActive,当用户开始与场景进行交互(例如从应用切换器中选择场景)时,会调用。
    4. sceneWillResignActive(_:) 对应上面的ResignActive,当用户停止与场景交互(例如通过切换器切换到另一个场景)时调用。
    5. sceneWillEnterForeground(_:) 对应上面的EnterForeground,,即从后台状态变成开始或恢复状态。
    6. sceneDidEnterBackground(_:) 对应上面的EnterBackground,当场景进入后台时调用,即该应用已最小化但仍存活在后台中。
    7. 与此同时,appDelegate中多了有关session管理的代理函数: + application(:configurationForConnecting:options:), 会返回一个创建场景时需要的UISceneConfiguration对象。 + application(:didDiscardSceneSessions:), 当用户通过“应用切换器”关闭一个或多个场景时会被调用。
页面(ViewController)的生命周期

调用的顺序如下:

  1. viewDidLoad() 页面加载函数
  2. viewWillAppear() 页面即将显示
  3. viewWillLayoutSubviews() 页面中布局即将发生变化
  4. viewDidLayoutSubviews() 页面中布局已经变化
  5. viewDidAppear() 页面已经显示
  6. viewWillDisappear() 页面即将离开
  7. viewDidDisappear() 页面已经离开
  8. didReceiveMemoryWarning 收到内存警告
  9. deinit 页面已销毁

当发生由VC1 push 到VC2 时,顺序如下

  1. vc2 didload
  2. vc1 willdisappear
  3. vc2 willappear
  4. vc2 willlayoutsubviews
  5. vc2 didlayoutsubviews
  6. may have vc1 willlayoutsubviews & didlayoutsubviews
  7. vc1 diddisappear
  8. vc2 didappear

此时,如果再从vc2 pop回 vc1, 顺序如下:

  1. vc2 willdisappear
  2. vc1 willappear
  3. vc1 willlayoutsubviews
  4. vc1 didlayoutsubviews
  5. vc2 diddisappear
  6. vc1 didappear
  7. vc2 deinit(如果不存在内存泄漏,正常是会销毁的)

标签: 生命周期

添加新评论

0%