ios - 保持内存清洁并杀死 ViewControllers

标签 ios swift xcode memory-management viewcontroller

我注意到,当我在我的 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/

相关文章:

ios - Instagram API iOS 客户端可以注销 Instagram

iphone - 如何在不阻塞 iPhone 应用程序中的用户界面的情况下运行进程

ios - 如何仅在选择休息选项卡栏项目上显示选项卡栏项目的标题,在 Swift 中将没有标题

cocoa - 在 NSView 中执行拖放时出现 kCGErrorFailure

ios - Xcode 嵌入式二进制文件发布与调试

iphone - 如何在 subview 中访问ViewController的数据?

ios - Swift - Firebase 获取所有键并将它们存储到数组中

swift - 将不带分隔符的字符串转换为 Double/CLLocationDegrees

ios - 调试警告 Xcode - dwarf-with-dsym?

ios - 如何使用 CMDeviceMotion 检测我的设备移动的速度?