我注意到,当我在我的 iOS 应用程序中导航时,内存堆栈会随着每个打开的 viewController 而增长。
我的导航是基于 segues 的,我在执行每个 segues 之前执行 self.dismiss()
。不过,它看起来像 viewControllers 堆栈在内存中。
我怎样才能避免这种情况?
在 Android 中,finish()
会终止 Activity(在大多数情况下),因此我需要在 iO 中进行替代。
最佳答案
内存问题可能有多种原因,不一定是 UIViewController。为了找到并解决问题,您必须将问题的范围从“应用程序”缩小到某个屏幕甚至类。然后您可以检查代码并尝试找出可疑代码的位置。
解决这个问题不是一项简单的任务,也没有“如何修复我的应用程序的内存问题”教程,您必须检查您的代码并与内存泄漏的潜在原因进行比较。
此外,您还必须小心内存泄漏的误报。以下是我在怀疑存在内存问题时遵循的一些步骤。
浏览应用程序“直到最后”,然后返回“主屏幕”,如果内存下降,一切都很好。
如果内存没有下降,我会多次执行相同的导航,如果内存以相同的步骤增加(或多或少但接近),则存在问题。如果内存没有增加(可能只是一点点,几kb)那么没关系,这意味着内存中缓存了一些 Assets (图像,文件等)。但是您也需要一种方法来测试这种情况。
现在我们又回到了“内存再次增加几乎和第一次一样”,现在我做一个干净的运行,一次显示每个屏幕,我只是打开屏幕回去(关闭/弹出 Controller )并观察,如果内存下降,则不是屏幕泄漏。当我发现增加内存的屏幕一去不复返时:
- 检查 Controller 是否作为引用传递给其他不会被释放的对象(单例类或其他,取决于应用程序)。
- 检查 Controller 是否作为“委托(delegate)”发送给任何其他类,以及这些委托(delegate)是否正确定义(强委托(delegate)是一个 biiiiig 问题)。
- 如果以上都没有问题,那么我将简单地注释所有执行任何工作的代码,然后重试。如果注释代码不会丢失内存(这种情况很少发生),则屏幕不正确。
- 如果在注释代码后内存下降,我会开始取消对代码的注释并再次运行,直到您找到导致您出现问题的代码段。
要记住一件事,在调查内存问题时必须有耐心,老实说,有时你也需要运气。
关于ios - 保持内存清洁并杀死 ViewControllers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53854829/