iOS低内存警告和模拟器的“模拟内存警告”

时间:2013-02-05 13:45:54

标签: ios xcode memory ios-simulator

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

  • [AppDelegate applicationDidReceiveMemoryWarning:]

  • UIApplicationDidReceiveMemoryWarningNotification

  • [UIViewController didReceiveMemoryWarning]

这些物品之间有什么关系?它们都是在收到低内存条件时发生的还是它们有微妙的差异?他们以什么顺序执行?

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

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

2 个答案:

答案 0 :(得分:3)

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

allocations for imageNamed

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

无论如何,这里是使用UIApplicationDidReceiveMemoryWarningNotification加载图片的日志,第一个没有NSCache,其次是countLimit为50,在每个结尾处清除缓存:< / p>

NSCache without and with countLimit

答案 1 :(得分:0)

部分答案:

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

  1. [AppDelegate applicationDidReceiveMemoryWarning:
  2. [UIViewController didReceiveMemoryWarning]
  3. UIApplicationDidReceiveMemoryWarningNotification