当前位置:   article > 正文

ios:生命周期及AppDelegate、SceneDelegate_ios之中的appdelegate还是screendelegate

ios之中的appdelegate还是screendelegate

AppDelegate

说明

打开你 app 的 main.m 文件,可以看到

// UIApplicationMain主要负责了:从给定的类名初始化应用程序对象、从给定的应用程序委托类,初始化一个应用程序委托、启动主事件循环,并开始接收事件
// 第三个参数 principalClassName -- UIApplication 或 UIApplication 子类,nil 默认为 UIApplication
// 第四个参数 delegateClassName -- AppDelagate 类名
int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

从代码可以看出,AppDelegate 就是一个 App 的入口,有点像 vue 的 App.vue。

应用

苹果的官方文档都建议应该由AppDelegate来处理这些工作:

  1. app的启动代码;
  2. 响应app的状态,比如app切换到后台和前台等状态;
  3. 响应外部传递给app的通知,比如说push,low-memory warnings;
  4. 决定了app的状态是否应该保存或者恢复;
  5. 响应不是发送给特定view或者vc,而是发送给app本身的事件;
  6. 用来保存一些不属于特定vc的数据。

虽然官方建议将上述操作放在 AppDelegate 来处理,但是一个业务逻辑稍复杂点的项目,上述6点的所有功能的代码直接一股脑塞到一个文件里,会比较臃肿,可能会将其拆开。

SceneDelegate

在iOS 13(及以后版本)上,SceneDelegate将负责AppDelegate的某些功能。 最重要的是,window(窗口)的概念已被scene(场景)的概念所代替。 一个应用程序可以具有不止一个场景,而一个场景现在可以作为您应用程序的用户界面和内容的载体(背景)。

尤其是一个具有多场景的App的概念很有趣,因为它使您可以在iOS和iPadOS上构建多窗口应用程序。 例如,文档编辑器App中的每个文本文档都可以有自己的场景。 用户还可以创建场景的副本,同时运行一个应用程序的多个实例(类似多开)。

生命周期

App的生命周期状态

  • Not running(未运行):程序未运行
  • Inactive(未激活):程序在前台运行,但没有接收到事件。在没有事件处理情况下程序通常停留在这个状态。
  • Active ( 激活 ): 程序在前台运行而且接收到了事件。这也是前台的一个正常的模式。
  • Backgroud ( 后台 ): 程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。时间到之后会进入挂起状态- (Suspended)。有的程序经过特殊的请求后可以长期处于Backgroud状态。
  • Suspended ( 挂起 ): 程序在后台但是却不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在 内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。

IOS13以前(不包括13)

func application(_:willFinishLaunchingWithOptions:)
func application(_:didFinishLaunchingWithOptions:)
// app初始化

func applicationDidBecomeActive(UIApplication)
// app已经被激活

func applicationWillResignActive(UIApplication)
// app即将被挂起

func applicationDidEnterBackground(UIApplication)
// app已经进入后台

func applicationWillEnterForeground(UIApplication)
// app即将回到前台

func applicationWillTerminate(UIApplication)
// app即将被杀死
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

IOS13以后

scene:(UIScene *)scene willConnectToSession
// 初始化

sceneDidBecomeActive:(UIScene *)scene
// 已经被激活

sceneWillResignActive:(UIScene *)scene
// 即将被挂起

sceneDidEnterBackground:(UIScene *)scene
// 已经进入后台

sceneWillEnterForeground:(UIScene *)scene
// 即将回到前台

sceneDidDisconnect:(UIScene *)scene
// 即将被杀死

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

总结

1、iOS13之前,appDelegate的职责全权处理App生命周期和UI生命周期

2、iOS13之后,appDelegate的职责是处理App生命周期和新的SceneSession生命周期。

3、所有UI生命周期交给SceneDelegate处理,appDelegate不在负责UI生命周期。

参考文档

https://www.cnblogs.com/Jamwong/p/12347288.html
https://blog.csdn.net/nupt_zhai/article/details/106409586

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/124934
推荐阅读
相关标签
  

闽ICP备14008679号