每当我创建一个新的View Controller子类时,Xcode会自动添加方法
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated
}
通常我只是删除它或忽略它。这就是我所见过的所有教程。但我认为,因为Xcode每次都给我,所以它应该有点重要,对吧?我该怎么办?我假设处理资源意味着将它们设置为nil,但究竟是什么"可以重建的资源"?
我见过这些问题:
但他们都是斯威夫特之前。虽然我对Objective-C了解不多,但我听说内存管理不同。这对我在didReceiveMemoryWarning
中应该做些什么有什么影响?
其他说明:
didReceiveMemoryWarning
{{1}}相当简短。答案 0 :(得分:36)
Swift使用ARC就像Objective-C一样(source to Apple Docs)。同样的规则适用于释放内存,删除对象的所有引用,它将被解除分配。
我认为处理资源意味着将它们设置为nil,但究竟是什么"可以重建的资源"?
"可以重建的资源"真的取决于你的申请。
假设您是一款处理大量图片的社交媒体应用。您需要一个快速的用户界面,以便在内存中缓存接下来的20张图片以快速滚动。这些图像始终保存在本地文件系统中。
您正在制作一款具有多种不同等级的精彩游戏。 将等级加载到您喜爱的游戏引擎需要一段时间,因此如果用户有足够的内存,您可以在玩2级时加载3级。
LevelCache.sharedCache().nextLevel = nil
释放所有记忆永远不要释放屏幕上的内容。我已经看到相关问题的一些答案解除了UIViewController的视图。如果你从屏幕上移除所有东西,你可能会崩溃(在我看来)。
如果用户打开了一个他们正在编辑的文档,请不要将其解除分配。如果您的应用删除了他们的工作而没有得到保存,用户将非常生气。 (事实上,你可能应该有一些紧急保存机制,以便何时发生)
如果您的用户正在为您精彩的社交媒体应用撰写帖子,请不要让他们的工作浪费掉。保存并尝试在再次打开应用程序时恢复它。虽然设置很多工作我喜欢这样做的应用程序。
大多数现代设备很少耗尽内存。该系统在后台杀死应用程序非常出色,可以为前台运行的应用程序释放内存。 您可能已经看过一个应用程序" open"在App Switcher中,当你点击应用程序时,它打开了它的初始状态。操作系统在后台杀死了应用程序以释放内存。有关如何避免此问题的信息,请参阅State Restoration。
如果您的应用在没有进行大量处理时获得一致的内存警告,请确保您不会先泄漏内存。 检测内存泄漏超出了本答案的范围。 Docs和tutorial。
答案 1 :(得分:3)
调用didReceiveMemoryWarning
时,表示您的应用使用了太多内存(与设备内存相比),您应该release any additional memory used by your view controller
来减少应用内存。如果内存应用程序超过设备内存,iOS将立即终止您的应用程序。 "可以重建的资源"意味着你可以在某个地方重新创造它,你现在不需要它们(不需要把它们放在记忆中)。你可以在获得didReceiveMemoryWarning
时发布它。
以下是另一个详细主题:ios app maximum memory budget