【问题标题】:Memory leak after reinitializing root view controller of navigation controller重新初始化导航控制器的根视图控制器后的内存泄漏
【发布时间】:2017-09-15 12:49:39
【问题描述】:

我正在使用此代码重新加载导航控制器的根视图控制器。

if let newVC  = self?.storyboard?.instantiateViewController(withIdentifier: "MyViewController"), let nc = self?.navigationController {
                nc.setViewControllers([newVC], animated: true)
            }

但我发现这段代码会导致内存泄漏:使用这段代码没有释放内存。

如何捕捉和解决这个问题?有什么建议吗?

【问题讨论】:

  • 你怎么知道有泄漏?什么泄漏?
  • 如何释放之前根视图控制器的内存? @Alistra
  • 如果没有强引用会自动释放。
  • 在那个VC类中写下“deinit{print(self)}”,看看它是否被调用。
  • 如果您在调试器中运行应用程序,重现问题,然后点击“调试内存图”,您可以看到哪些对象仍然存在,更重要的是,究竟是什么在维护强烈参考他们。如果您正在泄漏,我怀疑上面的代码不是问题的根源,而是其他一些强引用周期或类似重复计时器的东西,它们保持强引用。见stackoverflow.com/questions/30992338/…

标签: ios swift memory-leaks


【解决方案1】:

当您设置新的视图控制器时,堆栈的所有内容都会被新的视图控制器替换。所有的 viewController 都会弹出。

您可以通过编写所有被替换的视图控制器的 deinit 方法来检查这一点。当您替换 viewControllers 时,所有 deinit 方法都会被调用。它会自动释放内存,您不必显式处理内存或释放内存。

查看此链接:https://developer.apple.com/reference/uikit/uinavigationcontroller/1621861-setviewcontrollers?language=objc

【讨论】:

    猜你喜欢
    • 2020-05-11
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 2019-08-18
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    相关资源
    最近更新 更多