ViewControllers何时调用deinit?在搬到后台期间?在搬迁期间?

时间:2018-02-24 21:22:54

标签: ios swift ios-lifecycle

我知道ViewController只有在不再需要时才会调用deinit方法(例如,在放松segue和后续解雇后)。

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

我的问题

1)当(应用程序状态为active / inactive / background / etc)时(如果有的话),如果应用程序由于内存限制而被系统终止,则deinit会被调用

2)当(应用程序状态为活动/非活动/后台/等)时,如果用户通过最近使用的应用程序屏幕终止应用程序,则deinit会被调用

3)当(应用程序状态为活动/非活动/后台/等)时(如果有的话),如果用户接受来电将应用程序移至后台,则会deinit被调用

4)当(应用程序状态为活动/非活动/后台/等)时,如果应用程序被用户打开另一个应用程序移动到后台,则会deinit被调用

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

View Controller Lifecycle (来自Apple Documentation

  

在取消分配类实例之前立即调用deinitializer。

(来自The Swift Programming Language

所以一般情况下,在你的所有例子中,deinit都不会被调用(除非你在任何一种情况下专门删除对ViewController的所有强引用,即便如此,只有在ARC赶上它之前执行停止)。

另请注意,如果您仍然具有对ViewController的强引用(通常由reference cycle无意引起),则另一个展开segue的示例将不会导致deinit调用。