iOS开发:如何在设备上引发低内存警告?

Bea*_*red 85 iphone ipad ios

我想在低内存条件下测试我的应用程序功能,但很难测试.当应用程序在设备上运行而不是模拟器时,如何在我的视图中引发触发didReceiveMemoryWarning方法的低内存警告?或者我可以在这些可能的条件下测试我的应用程序有哪些方法?

我无法使用模拟器的原因是我的应用程序使用游戏中心和邀请不在模拟器上工作.

Enz*_*ran 273

您可以调用私有方法:

[[UIApplication sharedApplication] performSelector:@selector(_performMemoryWarning)];
Run Code Online (Sandbox Code Playgroud)

只记得在调试时使用它,否则你的应用程序将被拒绝.

  • 而不是在代码中使用它,在调试器中执行它.只需点击暂停并输入`po [[UIApplication sharedApplication] performSelector:@selector(_performMemoryWarning)]` (27认同)
  • 而不是使用po,使用expr,即```expr(void)[[UIApplication sharedApplication] performSelector:@selector(_performMemoryWarning)];``` (17认同)
  • 在调试器中,您不需要使用没有标头的变通方法:`expr(void)[[UIApplication sharedApplication] _performMemoryWarning]` (11认同)
  • 看起来这段代码可以准确地模拟设备上的内存警告.谢谢恩佐! (6认同)
  • 对于希望使用 Swift 执行此操作的任何人:键入 `expr UIApplication.sharedApplication().performSelector("_performMemoryWarning")` 而不是使用通常的 `#selector` (3认同)
  • 对于 Swift 3:`UIApplication.shared.perform(Selector(("_performMemoryWarning")))` (2认同)
  • Swift 5: UIApplication.shared.perform(Selector(("_performMemoryWarning"))) (2认同)

Ole*_*ann 26

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

  • 问题是关于设备的模拟. (9认同)
  • 太好了谢谢!设备本身怎么样? (2认同)

Tho*_*asW 19

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

要在Xcode上使用应用程序中的Instruments,请使用Product - > Profile菜单项.

  • 好吧,没什么.当我使用Enzo的答案时,我必须在返回时重新加载视图,而不是使用此方法. (2认同)

Chi*_*buZ 10

我在Swift中重写了Enzo Tran的答案:

UIControl().sendAction(Selector(("_performMemoryWarning")), to: UIApplication.shared, for: nil)
Run Code Online (Sandbox Code Playgroud)


小智 8

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

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

  • 不太实际.调用私有方法进行测试的解决方案更好 (6认同)
  • 如果你想看看现实世界的场景,这不是一个好的解决方案.由于泄漏不是由于内存压力导致应用程序瘫痪.这很糟糕,因为您要做的是测试应用程序在高内存压力状态下的响应方式.在不利方面,更难以弄清楚问题是真正的泄漏或你引入的假货.如下所示,私有方法更适合测试. (4认同)
  • 这个答案不应该被低估,因为如果你想在内存真的很低的情况下测试应用程序的行为,那么第二段实际上就是Apple所说的. (2认同)

Ado*_*els 8

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

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


Dan*_*ite 7

这是一个会调用它的菜单命令.

Hardware > Simulate Memory Warning 来自模拟器.

  • 问题是关于设备的模拟. (6认同)
  • 太好了谢谢!设备本身怎么样? (2认同)
  • 在 Xcode 10 中,它现在位于 Debug > Simulate Memory warning 下。 (2认同)

小智 7

将@ChikabuZ转换为swift 3:

UIControl().sendAction(Selector(("_performMemoryWarning")), to: UIApplication.shared, for: nil)
Run Code Online (Sandbox Code Playgroud)


ph1*_*lb4 7

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

for _ in 0...1200 {
    var p: [UnsafeMutableRawPointer] = []
    var allocatedMB = 0
    p.append(malloc(1048576))
    memset(p[allocatedMB], 0, 1048576);
    allocatedMB += 1;
}
Run Code Online (Sandbox Code Playgroud)

  • let d = Data.init(重复: 100, 计数: 1200000000) (3认同)
  • @Adobels,你应该将其作为答案发布:) (2认同)

Vis*_*hry 5

斯威夫特4:

UIApplication.shared.perform(Selector(("_performMemoryWarning")))
Run Code Online (Sandbox Code Playgroud)

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

    Button(action: {
        UIApplication.shared.perform(Selector(("_performMemoryWarning")))
    }, label: {
        Image(systemName: "memorychip")
    })
Run Code Online (Sandbox Code Playgroud)