如何在Swift中实现didReceiveMemoryWarning?

Sur*_*gch 32 didreceivememorywarning ios swift

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

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated
}
Run Code Online (Sandbox Code Playgroud)

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

我看过这些问题:

但他们都是斯威夫特之前.虽然我对Objective-C了解不多,但我听说内存管理不同.这对我应该做的事情didReceiveMemoryWarning有何影响?

其他说明:

  • 我模糊地了解自动引用计数和延迟实例化
  • 文档didReceiveMemoryWarning,我发现这是相当短暂.

Kev*_*vin 38

迅速

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

如何释放记忆

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

"可以重新创建的资源"实际上取决于您的应用程序.

例子

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

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

您正在创建一个具有多个不同级别的精彩游戏.将等级加载到您喜欢的游戏引擎需要一段时间,因此如果用户有足够的内存,您可以在玩2级时加载等级3.

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

什么不应该解除分配

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

例子

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

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

注意

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

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

  • 我刚刚回来再次阅读你的答案.这在当时非常有用,复习再次有用.我看到你做了一个编辑,以帮助其他人来参加此问答.我认为对人们有帮助的另一个编辑是一个代码示例.它不需要很长,但它应该包含`didReceiveMemoryWarning()`函数.它总是帮助我在上下文中看到具体的例子. (2认同)

tul*_*dev 5

didReceiveMemoryWarning被调用时,这意味着您的应用程序使用了太多内存(与设备内存相比),您应该release any additional memory used by your view controller减少应用程序的内存。如果内存应用程序超出了设备的内存,iOS 将立即终止您的应用程序。“可以重新创建的资源”意味着您可以在某个地方再次重新创建它,您现在不需要它们(不需要将它们放入内存中)。并且可以在 get 时释放它didReceiveMemoryWarning

这是另一个详细主题:ios app最大内存预算