【问题标题】:deinit in child view controllers子视图控制器中的 deinit
【发布时间】:2016-03-22 13:44:01
【问题描述】:

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

在这个新控制器中,我有一个 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”行(根据需要),但是当我按下导航返回栏按钮时(也不需要)。我不明白这是为什么?因为我还没有实现任何自定义逻辑来判断何时应该或不应该执行选项卡更改。

另外,我上午每次都会收到打印声明。

【问题讨论】:

  • 你不应该依赖 deinit 来移除观察者。您可以使用显式调用的自定义方法来执行此操作。参考:stackoverflow.com/a/18560069/5060335
  • @Udits 我可以在设置活动选项卡的方法中放入删除观察者,没问题,但我只是担心调用 deinit 时在后台发生的其他事情。 (弧线做它的事情,主要是释放内存)以及如何在子视图控制器中以最有效的方式设置活动选项卡

标签: ios swift uinavigationcontroller observers deinit


【解决方案1】:

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

这是预期的行为。

如果您返回到您所指的选项卡,您会看到子 VC 还活着并且很好。

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

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

这里没有问题。

【讨论】:

  • 感谢您的回复。我只是想让这一切在我脑海中一目了然..所以我想要发生的是在我设置活动选项卡和删除观察者的方法中,我还想 popToRoot 以便子控制器不再处于活动状态切换标签后。在阅读并更好地阅读您的答案后,我将更新问题以反映新问题
  • @user2363025 - 没有问题! - 是的,这就是答案,如果你也弹出到 root VC,那么子控制器将被销毁。
  • 我把popToRoot放在我切换标签的方法里,把tabController.setSlectedIndex移到我的viewdidDisappear中,谢谢!
  • 抱歉,我还有一个问题。我在 viewDidDisappear 中添加 setSelectedIndex 的方法正在按我的意愿工作。但是..我不明白为什么当我按下子视图控制器中的导航返回栏按钮并正常退出该屏幕时,标签栏没有切换?由于我在 viewDidDissappear 中没有任何条件是否设置所选索引。希望我已经解释清楚了。
  • 不太明白,能不能在上面加代码和问题?
猜你喜欢
  • 2016-07-05
  • 2018-08-23
  • 2017-10-06
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 2013-06-05
  • 2021-02-25
  • 2017-01-18
相关资源
最近更新 更多