为什么AppDelegate.swift窗口是可选的?

我正在阅读苹果文档 ,当我发现这个句子:

AppDelegate类包含一个属性: window

var window: UIWindow?

该属性存储对应用程序窗口的引用。 这个窗口代表了你的应用的视图层次的根。 这是所有的应用程序内容绘制的地方。 请注意,窗口属性是一个可选的 ,这意味着它可能没有值( 无 )在某一点。

我不明白的是:为什么这个物业在某个时候可能是零? 这是什么情况(来)无?

你可能并不总是需要它。 例如,当这两个方法被调用时:

 application(_:performFetchWithCompletionHandler:) application(_:handleEventsForBackgroundURLSession:completionHandler:) 

你的应用程序将不会显示给用户,所以不需要window

一如既往,在文档中更多

现在,我不确定这是什么内在的原因,但似乎是一个很好的可能性(至less对我来说)。 虽然如果有人能够提供更多的信息,我很乐意再学习一些。

当您以编程方式创build窗口而不是使用自动设置window属性的主故事板时,它变得更加明显。

当您的委托对象(您的案例中的AppDelegate )被创build时,您可能不希望或不能立即创build窗口。 通常你不需要创build窗口并设置属性,直到application(_:didFinishLaunchingWithOptions:)被调用。 所以直到窗口创build和属性设置它将是nil
就像Losiowaty 已经说过的那样 ,当应用程序启动时,情况也是如此,而不是显示给用户 – 例如当在后台处理位置更新或其他信息时。

如果该属性是非可选的,那么当你创buildAppDelegate对象时,你将不得不创build窗口,这个对象既不需要也不需要。

当您closures应用程序时,您的应用程序仍然可以在后台接收无声通知或下载数据。

在下面的图像中,被圈起来的红色 是为了当你的应用程序仍然在做什么,但它不再屏幕上。 它在后台,所以AppDelegate不再需要一个window 。 因此它将被设置nil

简单的概述

在这里输入图像说明


细节概述

在这里输入图像说明

FWIW,下面的代码不会使应用程序启动与vc

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { let vc = ViewController() window?.rootViewController = vc window?.makeKeyAndVisible() return true } 

为什么它不起作用? 因为window属性是可选的,最初设置为nil。 它需要被实例化

下面的代码将工作

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { let vc = ViewController() window = UIWindow(frame: UIScreen.main.bounds) // Now it is instantiated!! window?.rootViewController = vc window?.makeKeyAndVisible() return true }