保持内存干净并杀死ViewController

时间:2018-12-19 15:52:49

标签: ios swift xcode memory-management viewcontroller

我注意到,随着我在iOS应用程序中浏览内存的增加,每个打开的viewController都会增加。

我的导航基于segues,我在执行每个segue之前先进行self.dismiss()。尽管如此,它看起来仍然像viewControllers堆在内存中一样。

如何避免这种情况?

在Android finish()中,Activity会被杀死(在大多数情况下),因此我需要在iO中使用另一种选择。

2 个答案:

答案 0 :(得分:1)

Per documentation在UIViewController.dismiss:

  

关闭由视图控制器模态显示的视图控制器。

因此调用此命令将关闭以模态显示的任何视图控制器。根据您的问题,我必须假设您的Segue是推式Segue,而不是模态,否则您将看到视图控制器消失。

您的“视图控制器堆栈”可能与UINavigationController上的导航堆栈有关。如果是这样,则这些视图控制器会保留在内存中,就像当视图控制器从堆栈中弹出时一样(即:用户从屏幕左边缘滑动或在导航栏中单击“返回”),将显示以前的视图控制器。 / p>

如果没有有关如何显示视图控制器或构建导航的更多信息,我认为您将无法获得更多答案。

答案 1 :(得分:1)

内存问题可能有多种原因,不一定是UIViewController。为了找到并解决问题,您必须将问题的范围从“应用程序”缩小到某个屏幕甚至某个类。然后,您可以检查代码并尝试找出可疑代码在哪里。

解决此问题不是一项直截了当的任务,并且没有“如何为我的应用程序解决内存问题”教程,您必须检查代码并将其与潜在的内存泄漏原因进行比较。

此外,您还必须注意内存泄漏的误报。当我怀疑有内存问题时,可以按照以下步骤操作。

通过应用程序导航至“直到最后”,然后返回“主屏幕”,如果内存下降,则一切正常。

如果内存没有下降,那么我会多次执行相同的导航,如果内存以相同的步长增加(或多或少,但关闭),那么就会出现问题。如果内存没有增加(可能只是一点点,几个kb),那没关系,这意味着内存中缓存了一些资产(图像,文件等)。但是您也需要一种方法来测试这种情况。

现在我们回到“与第一次相同的内存增加了”,现在我进行一次干净的运行,并一次获取每个屏幕,我只是打开屏幕返回(关闭/弹出控制器)并观察一下,如果内存下降,则不是屏幕泄漏。当我发现增加内存且永不退回的屏幕时:

  • 检查控制器是否作为对不会释放的其他对象(单个类或其他类,取决于应用程序)的引用而传递。
  • 检查控制器是否作为“委托”发送给其他任何类,以及是否正确定义了这些委托(强委托是一个问题)。
  • 如果上述所有方法都可以,那么我将仅注释执行所有工作的所有代码,然后重试。如果注释该代码不会丢失内存(这种情况很少发生),则屏幕不是正确的屏幕。
  • 如果在注释代码后内存下降,我将开始注释掉代码的一部分并再次运行,直到找到导致问题的代码段。

要记住的一件事,在调查内存问题时必须要有耐心,老实说,有时候你也必须很幸运。