3

iOS 下的应用程序通过以下机制收到内存不足警告:

  • [AppDelegate applicationDidReceiveMemoryWarning:]

  • UIApplicationDidReceiveMemoryWarningNotification

  • [UIViewController didReceiveMemoryWarning]

这些项目之间的关系是什么?它们都是在收到内存不足的情况时发生的,还是有细微的差别?它们按什么顺序执行?

在模拟器中有一个“模拟内存警告”选项。didReceiveMemoryWarning:除了在所有 UIViewControllers 上调用之外,这有什么作用吗?

我想使用 Xcode 分析器工具来查看这些天在缓存[UIImage imageNamed:]方法加载的图像周围发生了什么——它们是未缓存的吗?- 但我需要知道如何“正确”触发低内存条件 - 即使它只是通过分配大量内存。

4

2 回答 2

3

在回答您关于UIImage缓存的问题时imageNamed,是的,它似乎确实清除了缓存。在这里,我通过加载 225 张图像imageNamed,然后在执行 20 秒后,我模拟了一个内存警告:

imageNamed 的分配

话虽如此,我认为imageNamed缓存是一个钝器,我更喜欢通过 来做我自己的缓存NSCache,所以我可以通过设置来限制它应该在缓存中保留多少图像,countLimit目的是完全防止内存警告。顺便说一句,虽然NSCache不响应UIApplicationDidReceiveMemoryWarningNotification,但它会在真正的低内存情况下自动清除自己。但是,它不会响应在模拟器中手动模拟内存警告。

无论如何,这里是使用 a 加载图像的日志NSCache,首先没有 the countLimit,其次是 acountLimit为 50,在每个结束时清除缓存:

NSCache 没有和有 countLimit

于 2013-02-05T15:05:01.467 回答
0

部分答案:

我已经确认在模拟器上(iOS Simulator 6.0 上的 iOS6.1),“模拟内存警告”会导致所有三种机制都被触发,顺序如下:

  1. [AppDelegate applicationDidReceiveMemoryWarning:
  2. [UIViewController didReceiveMemoryWarning]
  3. UIApplicationDidReceiveMemoryWarningNotification
于 2013-02-05T14:04:25.127 回答