John Smith
John Smith

Reputation: 12807

Deal with potential memory issue in iPhone

What ways are there to deal with memory issues on the iPhone?

Is it possible to ask how much memory is available before jumping into a memory intensive section of code?

(or perhaps Apple would just say that if you have to use so much memory you are on the wrong platform?)

Upvotes: 1

Views: 303

Answers (3)

hotpaw2
hotpaw2

Reputation: 70733

Apple appears not to be telling developers because they want to change the amount of memory available in new devices and OS releases. The number went way up on a freshly booted iPhone 4 and way down under iOS 4.0 after typical use on an iPhone 3G.

One possible method is to "preflight" the memory required for successful completion of some operation (e.g. malloc, check and then free the blocks that add up to your requirement). You can malloc in small chunks using a timer spanning many milliseconds to see if you can "push" other apps out of memory. But even this method is no guarantee, as Mail or some other background app could jump in and consume memory even when your app is frontmost.

If you use less than 20MB at any point in time, then a huge percentage of games in the App store will fail before your app does (just my random opinion).

Upvotes: 1

Art Gillespie
Art Gillespie

Reputation: 8757

UIApplicationDelegate's applicationDidReceiveMemoryWarning: will let you know if you're using too much memory. If you want to check before a memory intensive operation, here's a function that gets the available free memory in bytes on iOS:

natural_t  TSGetFreeSystemMemory(void) {
    mach_port_t           host_port = mach_host_self();
    mach_msg_type_number_t   host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
    vm_size_t               pagesize;
    vm_statistics_data_t     vm_stat;

    host_page_size(host_port, &pagesize);

    if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS) 
        printf("failed to get host statistics");;

    // natural_t   mem_used = (vm_stat.active_count + vm_stat.inactive_count + vm_stat.wire_count) * pagesize;
    natural_t   mem_free = vm_stat.free_count * pagesize;

    return mem_free;
}

Upvotes: 2

Matt Williamson
Matt Williamson

Reputation: 40233

Put the following in your app delegate and it will be called when memory is starting to run low. This is the Apple way of doing things:

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
    // Free some memory or set some flag that we are low
}

Upvotes: 0

Related Questions