deinit在子视图控制器中

时间:2015-12-16 12:12:16

标签: ios swift uinavigationcontroller observers deinit

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

在这个新控制器中,我有一个删除观察者的deinit并打印出“控制器在此处被去初始化”。

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

现在......我在子控制器中有另一种方法,用于设置标签栏控制器的活动选项卡。当这个动作发生时,我没有看到print语句表明在这种情况下没有调用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 func中显式调用popToRoot时,viewDidDisappear会执行“tabbar.setSelectedIndex”行(根据需要),但是当我按下导航栏栏按钮时它(不需要)。我不明白为什么会这样?因为我没有实现任何自定义逻辑,因为它应该或不应该执行标签更改。

此外,我 AM 每次都会收到打印声明。

1 个答案:

答案 0 :(得分:2)

当您在UITabBarController中切换标签时,不会从内存中释放以前的标签的控制器

这是预期的行为。

如果你回到你所指的标签,你会发现孩子VC还活着。

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

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

这里没问题。