【问题标题】:iOS low memory warnings and simulator's "Simulate memory warning"iOS 内存不足警告和模拟器的“模拟内存警告”
【发布时间】:2013-01-20 11:11:17
【问题描述】:

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

  • [AppDelegate applicationDidReceiveMemoryWarning:]

  • UIApplicationDidReceiveMemoryWarningNotification

  • [UIViewController didReceiveMemoryWarning]

这些项目之间的关系是什么?它们都是在收到低内存条件时发生的,还是它们有细微的差异?它们按什么顺序执行?

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

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

【问题讨论】:

    标签: ios xcode memory ios-simulator


    【解决方案1】:

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

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

    无论如何,这里是加载带有NSCache 的图像的日志,首先没有countLimit,其次使用50 的countLimit,在每个末尾清除缓存:

    【讨论】:

    • 谢谢罗伯。有趣的是,“模拟内存警告”做了它应该做的事情——我担心这是一个表面上蓬松的选项,只是调用了 didReceiveMemoryWarning 而已。
    • @occulus 我不怪你。当我第一次尝试“模拟内存警告”时,我也有同样的担忧。
    【解决方案2】:

    部分答案:

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

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

    【讨论】:

    • 似乎 UIApplicationDidReceiveMemoryWarningNotification 并不总是在旧模拟器上触发(在我的例子中是 iOS 5 模拟器)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 2010-10-04
    • 1970-01-01
    • 2012-03-03
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多