解决从呈现的 UITableViews 增加内存

Solving raising memory from presented UITableViews

我的应用程序的问题是内存使用率不断上升。 我有一个使用多个 UITableView 的应用程序,它的设置如下:

UITableView 2,3,4,5,6中的所有Cell都包含图片。 当我输入 UITableView 2、3、4、5 和 6 时,随着应用程序加载图像,内存使用量如预期的那样增加。当我关闭我所在的 UITableview 并进入另一个 UITableview 时,内存使用量继续上升。

我想做的是在关闭 UITableview 2、3、4、5 或 6 时清除内存。 这将意味着内存使用不会继续增加。

我目前使用以下方法关闭 UITableView:

@IBAction func Back(_ sender: Any) {

    NotificationCenter.default.removeObserver(self)

    self.dismiss(animated: true, completion: nil)
}

图像存储在应用程序的文件夹中。图像的名称存储在一个数组中,在我的例子中这个数组称为 foodImageArray。通过读取数组并将每个单元格链接到相应的图像,UItableView 图像按顺序填充。

cell.foodImage.image = UIImage(named: foodImageArray[indexPath.row] + ".jpg")

导致内存增长的三种类内存问题:

  1. 缓存内存:

    这是应用程序在内存中保留资源的时候,以防您再次使用这些资源。示例包括图像缓存和 URLCache。当您从视图控制器 1 转到视图控制器 2-6 然后再返回时,您不应该期望内存会下降到显示后者视图控制器之前的状态。

    话虽这么说,如果您再次、反复地通过视图控制器 2-6,并且内存继续以相同的速度增加,那么这可能不是缓存问题,相反,它很可能“废弃”的记忆,下面讨论。但如果内存不继续增长,这可能不是问题。当设备开始 运行 内存不足时,它会为您清除缓存。

  2. 废弃的记忆:

    这不是缓存的问题,而是每次您通过视图控制器 2-6 时您的应用程序都无法释放大量内存。这个问题的一个常见来源是“强引用循环”或循环故事板转场。

    您可以通过多次遍历所有视图控制器然后点击“调试内存图”按钮来检测这一点(参见 )。如果您看到已关闭的视图控制器仍然位于左侧面板中(这意味着即使您已关闭它们,它们仍在内存中),那么您可能遇到了强引用循环或一些类似的问题。

  3. 内存泄漏:

    虽然许多人不严格地使用术语“泄漏”,但它实际上指的是一个非常具体的问题,即您在应用程序的任何地方都没有对内存的强引用(即没有引用循环),但它仍然在泄漏。这是一个困扰我们手动引用计数和 Objective-C 代码的问题,但在 Swift 中相对不常见。如果您分析您的应用程序并使用“泄漏”工具,它将帮助您识别这些案例。

最重要的是,您必须通过多次运行该应用程序(第一次不要太担心)并查看内存是否继续增长来确定问题的性质。如果在您运行该应用程序时它在后续迭代中仍然增长,则使用“调试内存图”来查找强引用循环(或者不太可能,使用“泄漏”工具来查找实际泄漏)。