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

3

iOS应用程序通过以下机制接收低内存警告:

  • [AppDelegate applicationDidReceiveMemoryWarning:]

  • UIApplicationDidReceiveMemoryWarningNotification

  • [UIViewController didReceiveMemoryWarning]

这些项目之间有什么关系?当收到低内存条件时,它们是否都会发生或者它们之间有微妙的差异?它们的执行顺序是什么?

在模拟器中有一个选项可以“模拟内存警告”。除了调用所有UIViewControllers上的didReceiveMemoryWarning:外,这个选项还有其他作用吗?

我想使用Xcode分析器工具来查看缓存[UIImage imageNamed:]方法加载的图像的最新情况——它们是否未被缓存?——但我需要知道如何“正确地”触发低内存条件——即使只是分配大量内存。

2个回答

3
关于UIImage的缓存问题,对于imageNamed方法,是会清除缓存的。在这里,我通过imageNamed方法加载了225张图片,然后在执行20秒后模拟了一次内存警告:allocations for imageNamed虽然如此,我认为imageNamed的缓存机制比较粗糙,我更喜欢使用NSCache来进行自己的缓存管理。通过设置countLimit,我可以控制缓存中保留的图片数量,从而避免发生内存警告。值得一提的是,虽然NSCache不会响应UIApplicationDidReceiveMemoryWarningNotification,但它会在真正的低内存情况下自动清空缓存。然而,在模拟器中手动触发内存警告时,NSCache并不会做出响应。
下面是使用NSCache加载图片的日志,第一次是没有设置countLimit,第二次是设置了countLimit为50,并在每次加载完成后清空缓存:NSCache without and with countLimit

谢谢Rob。有趣的是看到“模拟内存警告”做了它应该做的事情——我担心它只是一个调用didReceiveMemoryWarning而不做其他任何事情的装饰性选项。 - occulus
@occulus 我不怪你。当我第一次尝试“模拟内存警告”时,我也有同样的担忧。 - Rob

0

部分答案:

我已确认在模拟器上(iOS Simulator 6.0 上的 iOS6.1),"模拟内存警告" 会按照以下顺序触发所有三种机制:

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

似乎在旧模拟器上(我的情况是iOS 5模拟器),并不总是触发UIApplicationDidReceiveMemoryWarningNotification。 - Rivera

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接