ViewControllers 什么时候调用 deinit?在移动到后台期间?在暂停期间?

When do ViewControllers call deinit? During move to background? During move to suspended?

我知道 ViewController 将在不再需要时调用其 deinit 方法(例如,在展开转场和随后的解雇之后)。

但我想知道 deinit 在应用程序生命周期上下文中的行为是什么。

我的问题

1) 当(哪个应用程序状态 active/inactive/background/etc),如果有的话,如果应用程序由于内存限制被系统终止

,是否会调用 deinit

2) 何时(哪个应用程序状态 active/inactive/background/etc),如果有的话,如果用户通过最近使用的应用程序屏幕

终止了应用程序,是否会调用 deinit

3) 何时(哪个应用程序状态 active/inactive/background/etc),如果有的话,如果用户接听来电将应用程序移至后台,deinit 是否会被调用

4) 何时(哪个应用程序状态 active/inactive/background/etc),如果有的话,如果用户打开另一个应用程序将应用程序移至后台,是否会调用 deinit

当应用程序突然终止时(您的情况 1 或 2),通常不会调用任何代码,包括任何 deinit 代码。不需要 deinit,因为所有应用程序内存都会立即释放。

否则,当不再需要对象时调用deinit,这与外部事件无关,无论应用程序是在前台还是在后台。这仅取决于您作为程序员何时释放对象的所有权(例如,当您弹出导航控制器或关闭呈现的控制器时)。

deinit是Swift类的底层方法,不是UIKit的一部分,所以与view生命周期没有直接关系,即:

(来自 Apple Documentation

A deinitializer is called immediately before a class instance is deallocated.

(来自 The Swift Programming Language

所以一般来说,在你所有的例子中,deinit 不会被调用(除非你在任何这些情况下明确删除对 ViewController 的所有强引用,即使那样,只有当 ARC 在执行停止之前赶上它)。

另请注意,如果您仍然对 ViewController 有很强的引用(通常是由 reference cycle 无意中引起的),您的另一个展开转场示例将不会导致 deinit 调用。 =16=]