我注意到,随着我在iOS应用程序中浏览内存的增加,每个打开的viewController都会增加。
我的导航基于segues,我在执行每个segue之前先进行self.dismiss()
。尽管如此,它看起来仍然像viewControllers堆在内存中一样。
如何避免这种情况?
在Android finish()
中,Activity会被杀死(在大多数情况下),因此我需要在iO中使用另一种选择。
答案 0 :(得分:1)
Per documentation在UIViewController.dismiss:
关闭由视图控制器模态显示的视图控制器。
因此调用此命令将关闭以模态显示的任何视图控制器。根据您的问题,我必须假设您的Segue是推式Segue,而不是模态,否则您将看到视图控制器消失。
您的“视图控制器堆栈”可能与UINavigationController上的导航堆栈有关。如果是这样,则这些视图控制器会保留在内存中,就像当视图控制器从堆栈中弹出时一样(即:用户从屏幕左边缘滑动或在导航栏中单击“返回”),将显示以前的视图控制器。 / p>
如果没有有关如何显示视图控制器或构建导航的更多信息,我认为您将无法获得更多答案。
答案 1 :(得分:1)
内存问题可能有多种原因,不一定是UIViewController。为了找到并解决问题,您必须将问题的范围从“应用程序”缩小到某个屏幕甚至某个类。然后,您可以检查代码并尝试找出可疑代码在哪里。
解决此问题不是一项直截了当的任务,并且没有“如何为我的应用程序解决内存问题”教程,您必须检查代码并将其与潜在的内存泄漏原因进行比较。
此外,您还必须注意内存泄漏的误报。当我怀疑有内存问题时,可以按照以下步骤操作。
通过应用程序导航至“直到最后”,然后返回“主屏幕”,如果内存下降,则一切正常。
如果内存没有下降,那么我会多次执行相同的导航,如果内存以相同的步长增加(或多或少,但关闭),那么就会出现问题。如果内存没有增加(可能只是一点点,几个kb),那没关系,这意味着内存中缓存了一些资产(图像,文件等)。但是您也需要一种方法来测试这种情况。
现在我们回到“与第一次相同的内存增加了”,现在我进行一次干净的运行,并一次获取每个屏幕,我只是打开屏幕返回(关闭/弹出控制器)并观察一下,如果内存下降,则不是屏幕泄漏。当我发现增加内存且永不退回的屏幕时:
要记住的一件事,在调查内存问题时必须要有耐心,老实说,有时候你也必须很幸运。