如何在Swift中实现didReceiveMemoryWarning?

时间:2015-09-04 02:07:52

标签: ios swift didreceivememorywarning

每当我创建一个新的View Controller子类时,Xcode会自动添加方法

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated
}

通常我只是删除它或忽略它。这就是我所见过的所有教程。但我认为,因为Xcode每次都给我,所以它应该有点重要,对吧?我该怎么办?我假设处理资源意味着将它们设置为nil,但究竟是什么"可以重建的资源"?

我见过这些问题:

但他们都是斯威夫特之前。虽然我对Objective-C了解不多,但我听说内存管理不同。这对我在didReceiveMemoryWarning中应该做些什么有什么影响?

其他说明:

  • 我模糊地了解自动引用计数和延迟实例化
  • 我发现的didReceiveMemoryWarning {{1}}相当简短。

2 个答案:

答案 0 :(得分:36)

夫特

Swift使用ARC就像Objective-C一样(source to Apple Docs)。同样的规则适用于释放内存,删除对象的所有引用,它将被解除分配。

如何释放内存

  

我认为处理资源意味着将它们设置为nil,但究竟是什么"可以重建的资源"?

"可以重建的资源"真的取决于你的申请。

实施例

假设您是一款处理大量图片的社交媒体应用。您需要一个快速的用户界面,以便在内存中缓存接下来的20张图片以快速滚动。这些图像始终保存在本地文件系统中。

  • 图像占用大量内存
  • 你不需要在内存中存储这些图像。如果应用内存不足,请花一点时间从文件加载图像。
  • 当您收到内存警告时,您可以完全转储图像缓存。
  • 这将释放系统所需的内存

您正在制作一款具有多种不同等级的精彩游戏。 将等级加载到您喜爱的游戏引擎需要一段时间,因此如果用户有足够的内存,您可以在玩2级时加载3级。

  • Levels占用了大量内存
  • 你不需要内存中的下一个级别。他们很高兴但不是必不可少的。
  • LevelCache.sharedCache().nextLevel = nil释放所有记忆

你不应该解除分配

永远不要释放屏幕上的内容。我已经看到相关问题的一些答案解除了UIViewController的视图。如果你从屏幕上移除所有东西,你可能会崩溃(在我看来)。

实施例

如果用户打开了一个他们正在编辑的文档,请不要将其解除分配。如果您的应用删除了他们的工作而没有得到保存,用户将非常生气。 (事实上​​,你可能应该有一些紧急保存机制,以便何时发生)

如果您的用户正在为您精彩的社交媒体应用撰写帖子,请不要让他们的工作浪费掉。保存并尝试在再次打开应用程序时恢复它。虽然设置很多工作我喜欢这样做的应用程序。

注意

大多数现代设备很少耗尽内存。该系统在后台杀死应用程序非常出色,可以为前台运行的应用程序释放内存。 您可能已经看过一个应用程序" open"在App Switcher中,当你点击应用程序时,它打开了它的初始状态。操作系统在后台杀死了应用程序以释放内存。有关如何避免此问题的信息,请参阅State Restoration

如果您的应用在没有进行大量处理时获得一致的内存警告,请确保您不会先泄漏内存。 检测内存泄漏超出了本答案的范围。 Docstutorial

答案 1 :(得分:3)

调用didReceiveMemoryWarning时,表示您的应用使用了太多内存(与设备内存相比),您应该release any additional memory used by your view controller来减少应用内存。如果内存应用程序超过设备内存,iOS将立即终止您的应用程序。 "可以重建的资源"意味着你可以在某个地方重新创造它,你现在不需要它们(不需要把它们放在记忆中)。你可以在获得didReceiveMemoryWarning时发布它。

以下是另一个详细主题:ios app maximum memory budget