BeachRunnerFred
BeachRunnerFred

Reputation: 18558

iOS Development: How can I induce low memory warnings on device?

I'd like to test my app functions well in low memory conditions, but it's difficult to test. How can I induce low memory warnings that trigger the didReceiveMemoryWarning method in my views when the app is running on the device, not the simulator? Or what are some ways I can test my app under these possible conditions?

The reason I can't use the simulator is my app uses Game Center and invites don't work on the simulator.

Upvotes: 106

Views: 45065

Answers (10)

ph1lb4
ph1lb4

Reputation: 2122

If someone, for whatever reason, tries to do this in Swift 5 - here is how to allocate 1.2 GB of RAM:

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

Upvotes: 8

Vishal Chaudhry
Vishal Chaudhry

Reputation: 2874

Swift 4:

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

Can execute the above in response to an event/notification. For example:

    Button(action: {
        UIApplication.shared.perform(Selector(("_performMemoryWarning")))
    }, label: {
        Image(systemName: "memorychip")
    })

Upvotes: 5

Ole Begemann
Ole Begemann

Reputation: 135548

The iOS Simulator's Simulate Memory Warning menu item allows you to simulate a memory warning.

enter image description here

Upvotes: 28

Blazej SLEBODA
Blazej SLEBODA

Reputation: 9925

If someone, for whatever reason, tries to do this in Swift 4 - here is how to allocate 1.2 GB of ram.

let d = Data.init(repeating: 100, count: 1200000000)
  • This is helpful to trigger a warning alert in other apps

Upvotes: 16

kindaian
kindaian

Reputation: 147

Converted @ChikabuZ to swift 3:

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

Upvotes: 7

ChikabuZ
ChikabuZ

Reputation: 10185

I've re-written Enzo Tran's answer in Swift:

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

Upvotes: 14

ThomasW
ThomasW

Reputation: 17317

Using Instruments, use the menu item: Instrument -> Simulate Memory Warning.

To use Instruments on your app from Xcode, use the Product -> Profile menu item.

Upvotes: 23

Enzo Tran
Enzo Tran

Reputation: 5850

You can call the private method:

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

Just remember to use it on debug only, or else your app will get rejected.

Upvotes: 290

BinaryStar
BinaryStar

Reputation: 268

To test on a device, just add some code that periodically allocates large chunks of memory without freeing it (i.e. leak on purpose). You can do this in a separate thread, or in response to a timer, or using whatever mechanism that best allows you to test and observe the behavior of your application.

You might also choose to create a separate app that does something similar and is designed to run in the background, if you'd like to easily reuse this and/or test with multiple applications.

Upvotes: 10

Daniel A. White
Daniel A. White

Reputation: 190945

Theres a menu command that will invoke it.

Hardware > Simulate Memory Warning from the simulator.

Upvotes: 5

Related Questions