【问题标题】:Which memory is released by didReceiveMemoryWarning/viewDidUnload?didReceiveMemoryWarning/viewDidUnload 释放了哪些内存?
【发布时间】:2009-09-14 07:35:42
【问题描述】:

我的 iPhone 应用程序在部署到设备时遇到问题,主要是因为到目前为止我还没有处理内存警告(在模拟器中没有问题,我的开发机器上有 4GB 内存!)。没问题,我只需要更熟练地处理这些警告(不那么糟糕......)。

问题是,运行时释放哪些内存......只是视图和子视图?我怀疑只是这些,但想确保运行时不会取消引用我的控制器中的任何对象或内存(即不在视图中)。

子问题:如果只是视图和子视图,我是否需要在 viewDidLoad 中做一些特殊的事情以确保当视图被带回内存时,视图显示正确的数据,或者它是通过我的 IBOutlet 自动处理的-s?

【问题讨论】:

    标签: iphone objective-c memory-management


    【解决方案1】:

    视图或其子视图可能会缓存许多内容,例如图像数据。这些是将被清除的东西。 任何特定于您的应用程序的内容,您可以负担得起刷新,您需要自己处理回调。

    但是,这可能更多地表明您正在泄漏内存或没有像您可能的那样高效。使用 Leaks 工具在 Instruments 中运行该应用程序以及使用 CLANG 编译器的静态代码分析器运行该应用程序当然是值得的。另外,检查你的代码,看看你是否保留了你并不真正需要的内存块——你是否可以压缩更多的图像等等。

    请记住,在 3GS 或最新的 iPod touch 之前,系统内存为 128Mb但您应该只指望有大约 25-30Mb 可用于您的应用程序

    【讨论】:

    • 我认为要记住的关键是运行时不会为您发布任何内容。您可以清除的内容类别是您可以再次加载的任何数据(没有巨大的影响)、当前未显示的图像等,但由您决定在您的应用程序的上下文中另外值得记住的是通知是警告清理您的应用程序,并且您有责任摆脱当前不需要的任何内存。如果不注意“警告”将导致操作系统终止您的应用程序。
    • 不是说 128MB 和 25-30MB 吗?
    • 运行时不会在幕后释放任何东西,我的应用程序只是被警告......但运行时/内存管理器正在卸载视图是有道理的。这不是节省一些内存吗?此外,在消耗 7-8MB 内存后,我的应用程序会打开和关闭这些警告。泄漏工具显示了一个泄漏,但只有 32 个字节,所以假设不是一个严重的问题(尽管它让我很恼火!)。
    • @mahboudz - 哎呀是的 - 感谢您发现这一点。我一定有 C64 模拟器 ;-) 我会更新我的帖子来纠正它(所以如果有人想知道我们在说什么,我最初分别说 128k 和 25-30k)
    • @mblackwell8 - 是的,运行时确实清除了它可以透明地控制的东西。某些对象(例如 UIImageViews)能够清除其数据并按需重新加载。这对性能有影响,但不影响应用程序的逻辑一致性。它不会做的事情,我认为 Kevin 暗示的是,实际上是代表您释放您保留的任何对象。
    【解决方案2】:

    viewDidUnload 和 didRecieveMemoryWarning 都不会自动释放任何东西。您需要覆盖这两种方法。

    通常,viewDidUnload 应该释放视图中未在 IB 中创建的任何内容,并且当视图再次加载时您可以合理地处理重新加载。

    didRecieveMemoryWarning 是当系统内存不足时发送到您的应用程序的消息。当您的应用收到此消息时,您应该释放您不需要立即使用的所有内容,否则可能会导致系统强行关闭您的应用。

    【讨论】:

      猜你喜欢
      • 2011-10-14
      • 2011-05-20
      • 1970-01-01
      • 2011-07-01
      • 2023-03-03
      • 1970-01-01
      • 2011-04-10
      • 2012-09-22
      • 1970-01-01
      相关资源
      最近更新 更多