【问题标题】:iOS Development: How can I induce low memory warnings on device?iOS 开发:如何在设备上引发低内存警告?
【发布时间】:2011-06-10 16:03:32
【问题描述】:

我想在内存不足的情况下很好地测试我的应用功能,但测试起来很困难。当应用程序在设备而不是模拟器上运行时,如何在我的视图中引发触发 didReceiveMemoryWarning 方法的内存不足警告?或者在这些可能的条件下,我可以通过哪些方式测试我的应用?

我无法使用模拟器的原因是我的应用使用了 Game Center,并且邀请无法在模拟器上运行。

【问题讨论】:

    标签: iphone ipad ios


    【解决方案1】:

    iOS 模拟器的Simulate Memory Warning 菜单项允许您模拟内存警告。

    【讨论】:

    • 在设备上检查它的唯一方法是实际强制它,即长时间使用应用程序或密集的图像或你有什么,会因应用程序而异。一个建议可能是使用较旧的设备(也许是 3g?)而不是 iPhone 4,以帮助您更快地收到警告。
    • 谢谢,Jesse,我想我只是要在我的应用程序中添加一些技巧来模拟邀请,这样我就可以在模拟器中运行它并以这种方式引发内存警告。
    • 问题是关于设备上的模拟。
    【解决方案2】:

    如果有人出于某种原因尝试在 Swift 4 中执行此操作 - 以下是如何分配 1.2 GB 内存。

    let d = Data.init(repeating: 100, count: 1200000000)
    
    • 这有助于在其他应用中触发警告警报

    【讨论】:

    • 做这样的事情会混淆我试图在 Instruments 中查看的实际内存信息吗?虽然我发现在物理设备上没有正确的方法来执行此操作,但如果我的意思是查看我的应用程序中占用我内存的内容,那么这似乎会扭曲所有数据,我不会再有一个相对的答案。我仍然会看到是什么占用了 更多,但不是真正的比例。
    • 这会立即崩溃
    【解决方案3】:

    斯威夫特 4:

    UIApplication.shared.perform(Selector(("_performMemoryWarning")))

    可以响应事件/通知执行上述操作。

    【讨论】:

      【解决方案4】:

      如果有人出于某种原因尝试在 Swift 3 中执行此操作 - 以下是如何分配 1.2 GB 的内存。

         for i in 0...1200 {
            var p: [UnsafeMutableRawPointer] = []
            var allocatedMB = 0
            p.append(malloc(1048576))
            memset(p[allocatedMB], 0, 1048576);
            allocatedMB += 1;
         }
      

      【讨论】:

      • 让 d = Data.init(重复:100,计数:1200000000)
      • @Adobels 您应该将其发布为答案:)
      【解决方案5】:

      将@ChikabuZ 转换为 swift 3:

      UIControl().sendAction(Selector(("_performMemoryWarning")), to: UIApplication.shared, for: nil)
      

      【讨论】:

        【解决方案6】:

        我已经用 Swift 重写了Enzo Tran's answer

        UIControl().sendAction(Selector(("_performMemoryWarning")), to: UIApplication.shared, for: nil)
        

        【讨论】:

        • 谢谢! Xcode 警告“没有使用 Objective-C 选择器声明的方法”,但这仍然有效。
        【解决方案7】:

        使用仪器,使用菜单项:仪器 -> 模拟内存警告。

        要从 Xcode 在您的应用上使用 Instruments,请使用 Product -> Profile 菜单项。

        【讨论】:

        • @OrangeDog 发生了什么?
        • 好吧,没什么。当我使用 Enzo 的答案视图时,我必须重新加载它们,而不是使用这种方法。
        【解决方案8】:

        你可以调用私有方法

        [[UIApplication sharedApplication] performSelector:@selector(_performMemoryWarning)];
        

        请记住仅在调试时使用它,否则您的应用将被拒绝。

        【讨论】:

        • 看来这段代码准确地模拟了设备上的内存警告。谢谢恩佐!
        • 不要在代码中使用它,而是在调试器中执行它。只需点击暂停并输入po [[UIApplication sharedApplication]performSelector:@selector(_performMemoryWarning)]
        • 不使用po,使用expr,即expr (void)[[UIApplication sharedApplication] performSelector:@selector(_performMemoryWarning)];
        • 在调试器中,您不需要使用没有标头的解决方法:expr (void)[[UIApplication sharedApplication] _performMemoryWarning]
        • 对于希望使用 Swift 执行此操作的任何人:键入 expr UIApplication.sharedApplication().performSelector("_performMemoryWarning") 而不是使用通常的 #selector
        【解决方案9】:

        要在设备上进行测试,只需添加一些定期分配大块内存而不释放它的代码(即故意泄漏)。您可以在单独的线程中执行此操作,或响应计时器,或使用最适合您测试和观察应用程序行为的任何机制。

        如果您想轻松地重复使用它和/或使用多个应用程序进行测试,您也可以选择创建一个单独的应用程序来执行类似的操作并设计为在后台运行。

        【讨论】:

        • 不太实用。调用私有方法进行测试的解决方案更好
        • 如果您想查看真实世界的场景,这不是一个好的解决方案。由于泄漏而不是由于内存压力,您正在削弱应用程序。这很糟糕,因为您要做的是测试应用程序在高内存压力状态下的响应方式。不利的一面是,很难弄清楚问题是真正的泄漏还是您介绍的假泄漏。私有方法一更适合测试,如下所示。
        • 这个答案不应该被否决,因为如果你想在内存真的很低时测试你的应用程序的行为,第二段实际上是苹果所说的。
        • 答案将通过代码块进行改进以执行此分配!
        • 虽然设置起来需要做更多的工作,但这是一个比调用私有方法更现实的测试。当确实存在严重的内存压力时,您的应用程序是否能够执行您告诉它执行的操作?这些行动会缓解情况还是使情况变得更糟并导致 iOS 终止它?此外,私有方法不适用于测试 DISPATCH_SOURCE_TYPE_MEMORYPRESSURE。
        【解决方案10】:

        有一个菜单命令会调用它。

        Hardware > Simulate Memory Warning 来自模拟器。

        【讨论】:

        • 问题是关于设备上的模拟。
        • 在 Xcode 10 中,它现在位于 Debug > Simulate Memory 警告下。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-04
        • 2010-09-24
        • 1970-01-01
        • 2014-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多