适用于iPhone OS应用的可用内存

Available memory for iPhone OS app

在iPhone操作系统中,是否有一个函数或常量定义应用程序的可用内存量?

我正在寻找一种与设备无关的方式(ipod touch、iphone、ipad)来了解这个应用程序还剩下多少内存。


此函数将返回可用内存(字节):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#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;
}


以下swift函数将以字节为单位返回系统可用内存(RAM)。失败时将返回零。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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)
}


没有定义iPhone应用程序可以使用的最大内存量。您的应用程序是否会因内存不足而终止取决于操作系统使用的算法以及其他应用程序同时使用内存的情况(Safari、邮件等)。