【问题标题】:Will deinit gets called when a view controller gets disappeared?当视图控制器消失时会调用 deinit 吗?
【发布时间】:2019-08-08 01:27:15
【问题描述】:

我创建了两个视图控制器,例如

Navigation controller -> View Controller -> Details View Controller
          1                     2                      3

(2) View Controller 中有一个按钮,单击该按钮将显示 (3) Details View Controller。我已经创建了一个从按钮到 (3) VC 的 segue。

我在这两个类中添加了deinit 块。

deinit {
    print("vc deinit")
}

但是,这不会被记录。视图控制器何时会被释放?

Sample code

【问题讨论】:

  • 所提供的解决方案都没有回答这个问题。
  • 是否有任何特殊代码可能导致视图控制器中的保留周期?
  • @jsloop:您的第一个草图显示了原因:导航控制器持有对第一个 VC 的引用。
  • @AhmadF:在这种情况下,根视图控制器是导航控制器。但是,是的,这只是一个评论,并不打算涵盖所有可能的情况。

标签: ios swift uiviewcontroller deinit


【解决方案1】:

在这种情况下,每次点击导航上的后退按钮(弹出到上一个视图控制器)时,唯一会调用的deinit 是第二个(在Details View Controller 中实现的那个)。

那么,为什么第一个 deinitView Controller 中的那个)没有被调用?

那是因为它是导航控制器stack中的第一个视图控制器。推送到第二个视图控制器并不意味着前一个视图控制器已被释放并且仍然作为导航堆栈中的第一个元素存在;例如,这就是为什么当您从弹出的视图控制器返回时不应调用 viewDidLoad 方法的原因,这意味着它没有被释放。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-05
    • 2017-10-06
    • 2016-03-22
    • 2017-01-18
    • 2018-08-23
    • 2021-02-25
    • 2016-01-03
    • 1970-01-01
    相关资源
    最近更新 更多