【问题标题】:How to implement didReceiveMemoryWarning in Swift?如何在 Swift 中实现 didReceiveMemoryWarning?
【发布时间】:2015-11-30 01:54:11
【问题描述】:

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

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

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

我看过这些问题:

但它们都是 Swift 之前的版本。虽然我对Objective-C了解不多,但听说内存管理不一样。这对我在didReceiveMemoryWarning 中应该做什么有什么影响?

其他说明:

  • 我很清楚自动引用计数和惰性实例化
  • 我发现didReceiveMemoryWarning 上的documentation 相当简短。

【问题讨论】:

    标签: ios swift didreceivememorywarning


    【解决方案1】:

    斯威夫特

    Swift 像 Objective-C 一样使用 ARC (source to Apple Docs)。相同的规则适用于释放内存,删除对对象的所有引用,然后将其释放。

    如何释放内存

    我认为处置资源意味着将它们设置为零,但究竟什么是“可以重新创建的资源”?

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

    示例

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

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

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

    • 关卡占用大量内存
    • 您不需要内存中的下一级。它们很不错,但不是必不可少的。
    • LevelCache.sharedCache().nextLevel = nil 释放所有内存

    你不应该释放什么

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

    示例

    如果用户打开了正在编辑的文档,请不要释放它。如果您的应用删除了他们的工作而没有保存,用户会非常生气。 (事实上​​,你可能应该有一些紧急保存机制来应对这种情况)

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

    注意

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

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

    【讨论】:

    • 一般来说,您不需要处理那么多资源。我更新了答案以提供更多详细信息。
    • 我刚回来又看了你的回答。这在当时非常有帮助,并且复习再次很有帮助。我看到您进行了编辑以帮助其他参加此问答的人。我认为对人们有帮助的另一个编辑是代码示例。它不需要很长,但它应该包含didReceiveMemoryWarning() 函数。它总能帮助我在上下文中查看具体示例。
    【解决方案2】:

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

    这里是另一个详细的话题:ios app maximum memory budget

    【讨论】:

    • 您的链接有助于了解不同设备上的内存阈值。
    猜你喜欢
    • 2011-01-26
    • 2014-09-07
    • 2016-11-27
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 2012-10-09
    相关资源
    最近更新 更多