iPhone OS 应用程序可用内存

23

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

我正在寻找一种与设备无关的方式(iPod touch、iPhone、iPad),以了解应用程序还剩下多少内存。

3个回答

48

以下函数将返回可用内存的字节数:

#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;
}

谢谢Ben。只是想确认一下,你的解决方案是否使用了任何私有API?我需要导入哪些库来使用它? - hpique
这很棒 @BenGottlieb,怎么有人会有这样的想法?你写的代码,我从来没有想过要这样做。太棒了! - Hemang
4
警告:根据我的经验,我认为host_statistics()报告的数字是无用的 - 至少是空闲/总内存。如果你做一些谷歌搜索,你会发现更多人分享这个观点。 - Jan Slodicka

3
以下的Swift函数将返回系统可用的内存(RAM)字节数。如果失败,它将返回nil。
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)
}

3

iPhone应用程序可以使用的内存没有明确定义的最大限制。你的应用程序是否因为缺乏内存而被终止,取决于操作系统使用的算法以及同时使用内存的其他应用程序(如Safari、Mail等)。


如果你的内存不足,操作系统会根据需要终止 Safari、Mail 等线程。当你的内存不足时,你可以在控制台日志中看到这一点。 - progrmr
@hgpc,他的方法是找到如何查找“可用系统内存”,因为如果您不断分配,系统会为您释放更多内存,这不是一个确定的数字,如果您分配过多,您的进程将被终止。在我看来,没有iPhone应用程序应该使用超过30MB的内存。 - overboming
这仅供参考;系统将尝试为您清除内存,因此不应将此数字视为硬性标准。我主要将其用作查看我使用了多少内存的方式;观察数字波动,如果它开始可靠地下降,则可能表示存在内存泄漏或至少是资源占用过多的情况。 - Ben Gottlieb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接