1

我知道一旦不再需要aViewController就会调用它的方法(例如,在 unwind segue 和随后的解雇之后)。deinit

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

我的问题

deinit1)如果应用程序由于内存限制而被系统终止,则 何时(哪个应用程序状态为活动/非活动/后台/等),如果有的话,确实会被调用

deinit2)如果应用程序被用户通过最近使用的应用程序屏幕终止,则 何时(哪个应用程序状态为活动/非活动/后台/等)确实被调用

3)当(哪个应用程序状态为活动/非活动/后台/等),如果有的话,deinit如果应用程序被用户接受来电移动到后台,则确实被调用

deinit4)如果用户打开不同的应用程序将应用程序移到后台,则何时(哪个应用程序状态为活动/非活动/后台/等)确实会被调用

4

2 回答 2

3

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

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

于 2018-02-24T21:28:54.723 回答
1

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

查看控制器生命周期 (来自Apple 文档

在释放类实例之前立即调用 deinitializer。

(来自Swift 编程语言

因此,通常,在所有示例情况下,都不会调用 deinit(除非您在任何这些情况下专门删除对 ViewController 的所有强引用,即使那样,只有当ARC在执行停止之前赶上它时)。

另请注意,如果您仍然对 ViewController 有强引用(通常是由引用循环无意引起的),则展开 segue 的其他示例不会导致 deinit 调用。

于 2018-02-24T21:32:19.703 回答