有哪些方法可以解决iPhone上的内存问题?
在进入内存密集型代码段之前,是否可以询问可用内存量是多少?
(或者也许苹果只会说,如果你必须使用这么多内存,那么你是在错误的平台上?)
答案 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)
一种可能的方法是“预检”成功完成某些操作所需的内存(例如malloc,检查然后释放符合您要求的块)。您可以使用一个跨越几毫秒的计时器以小块的形式进行malloc,以查看是否可以“推送”其他应用程序的内存。但即使这种方法也无法保证,因为即使您的应用程序位于最前端,Mail或其他一些后台应用程序也可以跳入并消耗内存。
如果你在任何时间点使用少于20MB,那么应用程序商店中的大部分游戏都会在你的应用程序出现之前失败(只是我随意的意见)。
答案 2 :(得分:0)
将以下内容放入您的app委托中,当内存开始变低时,将调用它。这是Apple的做事方式:
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
// Free some memory or set some flag that we are low
}