23

Is there a function or constant defining the amount of available memory for an app in iPhone OS?

I'm looking for a device-independent way (iPod touch, iPhone, iPad) to know how much memory the app has left.

hpique
  • 119,096
  • 131
  • 338
  • 476

3 Answers3

48

This function will return the available memory in bytes:

#import <mach/mach.h> 
#import <mach/mach_host.h>

natural_t  freeMemory(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) NSLog(@"Failed to fetch vm 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;
    natural_t   mem_total = mem_used + mem_free;

    return mem_free;
}
Brad The App Guy
  • 16,255
  • 2
  • 41
  • 60
Ben Gottlieb
  • 85,404
  • 22
  • 176
  • 172
  • Thanks Ben. Just to confirm, does your solution use any private APIs? Which libraries should I import to use it? – hpique May 10 '10 at 05:01
  • This is good @BenGottlieb, How is someone have this mind? The code you've done here, I could never think to do? Great! – Hemang Oct 08 '13 at 10:36
  • 4
    Warning: Based on the experience I consider the numbers reported by host_statistics() as useless - at least the free/total memory. If you do some googling, you'll find more people sharing this opinion. – Jan Slodicka Nov 06 '13 at 11:20
3

There is no defined maximum amount of memory that an iPhone app can use. Whether your app will be terminated due to lack of memory depends on whatever algorithms the OS is using and what other apps happen to be using memory at the same time (safari, mail, etc.).

Mike Weller
  • 45,401
  • 15
  • 131
  • 151
  • The OS will kill off safari, mail, etc threads as needed if you are running low on memory. You can see this in the console logs as you get low on memory. – progrmr May 09 '10 at 21:36
  • @hgpc, his way to find how to find availiable *system memory', since system will free more for you if you keep allocating, it's not a definate number and if you allocate too much, your process get killed. No iphone application should use more overf 30MB of memory under my understanding. – overboming May 10 '10 at 06:16
  • This is for information only; the system will try to clear memory for you, so this number should not be taken as hard-and-fast. I mainly use it as a way to see how much memory I'M using; watching the number fluctuate, if it starts to drop reliably, it probably indicates a memory leak, or at least a resource hog. – Ben Gottlieb May 10 '10 at 11:28
3

The following Swift function will return the system's free memory (RAM) in bytes. It will return nil on failure.

func systemFreeMemorySize() -> UInt?
{
    let HOST_VM_INFO_COUNT: mach_msg_type_number_t = mach_msg_type_number_t(sizeof(vm_statistics_data_t) / sizeof(integer_t))

    let host: host_t = mach_host_self()

    var pageSize: vm_size_t = vm_size_t()
    let hostPageSizeKernStatus: kern_return_t = host_page_size(host, &pageSize)
    guard hostPageSizeKernStatus == KERN_SUCCESS else {
        NSLog("Error with host_page_size(): " + (String.fromCString(mach_error_string(hostPageSizeKernStatus)) ?? "unknown error"))
        return nil
    }

    var stats: vm_statistics_data_t = vm_statistics_data_t()
    var count: mach_msg_type_number_t = HOST_VM_INFO_COUNT

    let kernStatus: kern_return_t = withUnsafeMutablePointer(&stats) {
        return host_statistics(host, HOST_VM_INFO, host_info_t($0), &count)
    }

    guard kernStatus == KERN_SUCCESS else {
        NSLog("Error with host_statistics(): " + (String.fromCString(mach_error_string(kernStatus)) ?? "unknown error"))
        return nil
    }

    return UInt(stats.free_count) * UInt(pageSize)
}
Alex Zavatone
  • 4,106
  • 36
  • 54
dreamlab
  • 3,321
  • 20
  • 23