如何在Swift中实现didReceiveMemoryWarning?

每当我创build一个新的视图控制器子类,Xcode自动添加该方法

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

通常我只是删除它或忽略它。 这也是我见过的所有教程都做的。 但我认为,既然Xcode每次都给我,应该有点重要吧? 我应该在这里做什么? 我认为,处理资源意味着把它们设置为零,但究竟是“可以重新创build的资源”呢?

我看到了这些问题:

  • 如何实现didReceiveMemoryWarning?
  • UIViewController在ARC环境中的didReceiveMemoryWarning
  • iPhone开发 – 模拟内存警告

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

其他说明:

  • 我模糊地意识到自动引用计数和懒惰的实例化
  • 关于didReceiveMemoryWarning的文档 ,我发现是相当简短的。

迅速

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

如何释放内存

我认为,处理资源意味着把它们设置为零,但究竟是“可以重新创build的资源”呢?

“可以重新创build的资源”实际上取决于您的应用程序。

例子

假设你是一个处理大量图片的社交媒体应用程序。 你需要一个快速的用户界面,所以你caching内存中的下20张图片快速滚动。 这些图像总是保存在本地文件系统上。

  • 图像可能占用大量的内存
  • 内存中不需要这些图像。 如果应用程序的内存不足,多花一秒钟从文件加载图像就没有问题了。
  • 当您收到内存警告时,您可以完全转储图像caching。
  • 这将释放系统需要的内存

你正在创造一个惊人的游戏,有不同的层次。 在你喜欢的游戏引擎中加载一个级别需要一段时间,所以如果用户有足够的内存,你可以在玩2级的时候加载3级。

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

你不应该放弃什么

切勿取消分配屏幕上的内容。 我已经看到相关问题的一些答案释放UIViewController的视图。 如果你从屏幕上删除所有的东西,你可能会崩溃(在我看来)。

例子

如果用户打开了正在编辑的文档,请不要将其解除分配。 如果你的应用在没有保存的情况下删除了他们的工作,用户将非常生气。 (事实上​​,你可能应该有一些紧急存储机制,

如果您的用户正在为您的神话般的社交媒体应用程序写一篇文章,不要让他们的工作浪费。 保存并尝试在再次打开应用程序时进行恢复。 虽然设置我喜欢的应用程序是很多工作。

注意

大多数现代设备很less耗尽内存。 系统在后台杀死应用程序的function相当出色,可以为在前台运行的应用程序释放内存。 您可能在应用程序切换器中看到了一个“打开”的应用程序,但是当您点击应用程序时,该应用程序会打开到其初始状态。 操作系统在后台杀死了应用程序以释放内存。 有关如何避免此问题的信息,请参阅恢复状态 。

如果您的应用程序在执行大量处理时收到一致的内存警告,请确保您没有先泄漏内存。 检测内存泄漏超出了这个答案的范围。 文档和教程 。

didReceiveMemoryWarning被调用,这意味着你的应用程序使用太多的内存(与设备的内存相比),你应该release any additional memory used by your view controller以减less你的应用程序的内存。 如果内存应用程序超过设备的内存,iOS将立即终止您的应用程序。 “可以重新创build的资源”意味着你可以在某个地方重新创build一些资源,现在你不需要它们(不需要把它们放在内存中)。 当你得到didReceiveMemoryWarning时,你可以释放它。

这里是另一个细节主题: iOS应用程序最大内存预算

Interesting Posts