在子视图控制器中取消初始化

deinit in child view controllers

我有一个标签栏控制器,其中一个标签包含一个 table 视图。单击一行时,我会转到一个新的子控制器。

在这个新控制器中,我有一个删除观察者并打印 "controller is de-initialised here".

的 deinit

当我按下导航栏中的后退按钮时,我可以看到此操作调用了 de-init。

现在...我在那个子控制器中有另一种方法,它设置选项卡栏控制器的活动选项卡。发生此操作时,我没有看到表明在这种情况下未调用 de-init 的打印语句。

我想知道如何解决这个问题?我担心如果不调用 deinit,我会在内存中保留额外的东西。

更新: 在我设置活动选项卡的方法中,我还想在当前活动的子控制器上 popToRoot。我尝试了以下方法:

self.navigationController!.popViewControllerAnimated(true)
self.tabBarController?.selectedIndex = 2

我收到以下错误:

popViewControllerAnimated: called on <UINavigationController 0x15609a200> while an existing transition or presentation is occurring; the navigation stack will not be updated.

这是有道理的,但我想知道,有什么办法解决这个问题吗?

更新 2

为了避免上述问题,我将 popToRoot 放在我的观察者中,并将 tabbar.setSelectedIndex 添加到 viewDidDisappear。

func checkForSeg(){
      //self.tabBarController?.selectedIndex = 2
      self.navigationController!.popViewControllerAnimated(true)
 }

 override func viewDidDisappear(animated: Bool) {
      super.viewDidDisappear(true)
      print("view Did Disappear called?")
      self.tabBarController?.selectedIndex = 2
 }

但我不明白为什么当我按下导航后退栏按钮时标签栏没有切换索引(我不想要它,但我不明白为什么?)

当我在 checkForSeg 函数中显式调用 popToRoot 时,viewDidDisappear 会执行行 'tabbar.setSelectedIndex'(根据需要),但是当我按下导航后退栏按钮时它不会(也需要)。我不明白这是为什么?因为我还没有为何时应该或不应该执行选项卡更改实现任何自定义逻辑。

此外,我 AM 每次都得到打印语句。

当您在 UITabBarController 中切换选项卡时,您不会从内存中释放前一个 选项卡的控制器

这是预期的行为。

如果您返回到您所指的选项卡,您会看到 child VC 仍然有效。

任何选项卡的当前活动VC在应用程序执行期间将始终驻留在内存中。

因此,至少,当使用 UITabBarControllers 时,每个选项卡上的根 viewController 都保存在内存中,并且仅在应用程序终止或 tabBarController 终止时释放。

这里没有问题。