如何在Swift中实现didReceiveMemoryWarning?
How to implement didReceiveMemoryWarning in Swift?
每当我创建一个新的 View Controller 子类时,Xcode 会自动添加方法
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated
}
通常我只是删除它或忽略它。这也是我见过的所有教程所做的。不过我想既然Xcode每次都给我,应该有点重要吧?我应该在这里做什么?我假设处理资源意味着将它们设置为零,但 "resources that can be recreated" 到底是什么?
我看到了这些问题:
- How to implement didReceiveMemoryWarning?
- UIViewController's didReceiveMemoryWarning in ARC environment
- iPhone Development - Simulate Memory Warning
但他们都是pre-Swift。虽然对Objective-C了解不多,但听说内存管理不一样。这对我在 didReceiveMemoryWarning
中应该做的事情有何影响?
其他说明:
- 我对自动引用计数和惰性实例化一无所知
- 我发现
didReceiveMemoryWarning
上的 documentation 相当简短。
当didReceiveMemoryWarning
被调用时,这意味着您的应用程序使用了过多的内存(与设备内存相比),您应该release any additional memory used by your view controller
减少您的应用程序的内存。如果内存应用程序占用了设备内存,iOS 将立即终止您的应用程序。 "resources that can be recreated" 意味着你可以在某个地方重新创建它,你现在不需要它们(不需要将它们放在内存中)。你可以在得到 didReceiveMemoryWarning
.
时释放它
这里是另一个细节话题:ios app maximum memory budget
Swift
Swift 使用 ARC 就像 Objective-C 一样 (source to Apple Docs)。相同类型的规则适用于释放内存,删除对对象的所有引用,它将被释放。
如何释放内存
I assume that disposing of resources means setting them to nil, but what exactly are "resources that can be recreated"?
“可以重新创建的资源”确实取决于您的应用程序。
例子
假设您是一个处理大量图片的社交媒体应用。您想要一个活泼的用户界面,以便将接下来的 20 张图片缓存在内存中,以便快速滚动。这些图像始终保存在本地文件系统中。
- 图片会占用大量内存
- 你不需要内存中的那些图像。如果应用程序内存不足,多花一秒钟从文件加载图像就可以了。
- 当您收到该内存警告时,您可以完全转储图像缓存。
- 这将释放系统需要的内存
您正在创建一款具有多个不同级别的精彩游戏。
将一个关卡加载到您喜欢的游戏引擎中需要一段时间,因此如果用户有足够的内存,您可以在他们玩第 2 关时加载第 3 关。
- 关卡占用大量内存
- 你不需要记忆中的下一个级别。他们很高兴拥有但不是必需的。
LevelCache.sharedCache().nextLevel = nil
释放所有内存
你不应该释放什么
切勿取消分配屏幕上的内容。我已经看到一些相关问题的答案解除了 UIViewController 的视图分配。如果您从屏幕上删除所有内容,您很可能会崩溃(在我看来)。
例子
如果用户打开了他们正在编辑的文档,请不要取消分配它。如果您的应用程序在没有保存的情况下删除了他们的工作,用户将会非常生气。 (事实上 ,当发生这种情况时,您可能应该有一些紧急保存机制)
如果您的用户正在为您出色的社交媒体应用编写 post,请不要让他们的工作白费。保存它并在他们再次打开应用程序时尝试恢复它。尽管设置工作量很大,但我喜欢执行此操作的应用程序。
备注
大多数现代设备很少运行内存不足。该系统在后台杀死应用程序以释放前台应用程序 运行ning 的内存方面做得很好。
您可能已经在 App Switcher 中看到一个应用程序“打开”,但是当您点击该应用程序时,它会打开到初始状态。 OS 在后台终止了应用程序以释放内存。有关如何避免此问题的信息,请参阅 State Restoration。
如果您的应用在您未进行大量处理时收到一致的内存警告,请确保您没有先泄漏内存。
检测内存泄漏不在本答案的范围内。 Docs and a tutorial.
每当我创建一个新的 View Controller 子类时,Xcode 会自动添加方法
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated
}
通常我只是删除它或忽略它。这也是我见过的所有教程所做的。不过我想既然Xcode每次都给我,应该有点重要吧?我应该在这里做什么?我假设处理资源意味着将它们设置为零,但 "resources that can be recreated" 到底是什么?
我看到了这些问题:
- How to implement didReceiveMemoryWarning?
- UIViewController's didReceiveMemoryWarning in ARC environment
- iPhone Development - Simulate Memory Warning
但他们都是pre-Swift。虽然对Objective-C了解不多,但听说内存管理不一样。这对我在 didReceiveMemoryWarning
中应该做的事情有何影响?
其他说明:
- 我对自动引用计数和惰性实例化一无所知
- 我发现
didReceiveMemoryWarning
上的 documentation 相当简短。
当didReceiveMemoryWarning
被调用时,这意味着您的应用程序使用了过多的内存(与设备内存相比),您应该release any additional memory used by your view controller
减少您的应用程序的内存。如果内存应用程序占用了设备内存,iOS 将立即终止您的应用程序。 "resources that can be recreated" 意味着你可以在某个地方重新创建它,你现在不需要它们(不需要将它们放在内存中)。你可以在得到 didReceiveMemoryWarning
.
这里是另一个细节话题:ios app maximum memory budget
Swift
Swift 使用 ARC 就像 Objective-C 一样 (source to Apple Docs)。相同类型的规则适用于释放内存,删除对对象的所有引用,它将被释放。
如何释放内存
I assume that disposing of resources means setting them to nil, but what exactly are "resources that can be recreated"?
“可以重新创建的资源”确实取决于您的应用程序。
例子
假设您是一个处理大量图片的社交媒体应用。您想要一个活泼的用户界面,以便将接下来的 20 张图片缓存在内存中,以便快速滚动。这些图像始终保存在本地文件系统中。
- 图片会占用大量内存
- 你不需要内存中的那些图像。如果应用程序内存不足,多花一秒钟从文件加载图像就可以了。
- 当您收到该内存警告时,您可以完全转储图像缓存。
- 这将释放系统需要的内存
您正在创建一款具有多个不同级别的精彩游戏。 将一个关卡加载到您喜欢的游戏引擎中需要一段时间,因此如果用户有足够的内存,您可以在他们玩第 2 关时加载第 3 关。
- 关卡占用大量内存
- 你不需要记忆中的下一个级别。他们很高兴拥有但不是必需的。
LevelCache.sharedCache().nextLevel = nil
释放所有内存
你不应该释放什么
切勿取消分配屏幕上的内容。我已经看到一些相关问题的答案解除了 UIViewController 的视图分配。如果您从屏幕上删除所有内容,您很可能会崩溃(在我看来)。
例子
如果用户打开了他们正在编辑的文档,请不要取消分配它。如果您的应用程序在没有保存的情况下删除了他们的工作,用户将会非常生气。 (事实上 ,当发生这种情况时,您可能应该有一些紧急保存机制)
如果您的用户正在为您出色的社交媒体应用编写 post,请不要让他们的工作白费。保存它并在他们再次打开应用程序时尝试恢复它。尽管设置工作量很大,但我喜欢执行此操作的应用程序。
备注
大多数现代设备很少运行内存不足。该系统在后台杀死应用程序以释放前台应用程序 运行ning 的内存方面做得很好。 您可能已经在 App Switcher 中看到一个应用程序“打开”,但是当您点击该应用程序时,它会打开到初始状态。 OS 在后台终止了应用程序以释放内存。有关如何避免此问题的信息,请参阅 State Restoration。
如果您的应用在您未进行大量处理时收到一致的内存警告,请确保您没有先泄漏内存。 检测内存泄漏不在本答案的范围内。 Docs and a tutorial.