处理iPhone中潜在的内存问题

时间:2010-08-30 17:30:23

标签: iphone objective-c cocoa-touch

有哪些方法可以解决iPhone上的内存问题?

在进入内存密集型代码段之前,是否可以询问可用内存量是多少?

(或者也许苹果只会说,如果你必须使用这么多内存,那么你是在错误的平台上?)

3 个答案:

答案 0 :(得分:3)

UIApplicationDelegate的applicationDidReceiveMemoryWarning:会告诉您是否使用了太多内存。如果你想在内存密集型操作之前检查一下,这是一个在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;
}

答案 1 :(得分:2)

Apple似乎没有告诉开发人员,因为他们想要更改新设备和操作系统版本中可用的内存量。在iPhone 3G上典型使用之后,这款数字在新推出的iPhone 4上大幅提升,而在iOS 4.0下也是如此。

一种可能的方法是“预检”成功完成某些操作所需的内存(例如malloc,检查然后释放符合您要求的块)。您可以使用一个跨越几毫秒的计时器以小块的形式进行malloc,以查看是否可以“推送”其他应用程序的内存。但即使这种方法也无法保证,因为即使您的应用程序位于最前端,Mail或其他一些后台应用程序也可以跳入并消耗内存。

如果你在任何时间点使用少于20MB,那么应用程序商店中的大部分游戏都会在你的应用程序出现之前失败(只是我随意的意见)。

答案 2 :(得分:0)

将以下内容放入您的app委托中,当内存开始变低时,将调用它。这是Apple的做事方式:

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