基于可用RAM或iOS内存警告级别的自适应图像缓存

时间:2012-03-18 11:38:18

标签: ios memory memory-management didreceivememorywarning

我有一个缓存大图像的应用程序,以便用户不要等待imageWithContentsOfFile。作为一般规则,我缓存上一个和下一个图像。

1)我可以根据iPad中的可用内存自适应缓存吗?如果是,应该是什么门槛?以下是计算可用内存的函数

-(void) report_memory {
    struct task_basic_info info;
    mach_msg_type_number_t size = sizeof(info);
    kern_return_t kerr = task_info(mach_task_self(),
                                   TASK_BASIC_INFO,
                                   (task_info_t)&info,
                                   &size);
    if( kerr == KERN_SUCCESS ) {
        Log(@"Memory in use (in bytes): %u", info.resident_size);
    } else {
        Log(@"Error with task_info(): %s", mach_error_string(kerr));
    }
}

2)我知道除了私有/未记录的API之外没有办法知道内存级别警告,否则它可能是确定我可以缓存多少页面的一个很好的因素。但只是为了确认我可以用某种方式使用它们。

3)现在我正在考虑缓存3个屏幕(有6个图像)并且万一我的ViewController接收内存警告我卸载除可见屏幕之外的所有屏幕并重置屏幕数量以缓存到2(4个图像)。但我没有发现它是优化的,因为要么我的缓存少于可能的,要么在某些情况下甚至加载4导致崩溃。

2 个答案:

答案 0 :(得分:0)

所以等了这么久后,我回答我的问题,如果它可能对某人有帮助。

您应该避免任何未记录的API获取警告级别并根据该级别采取措施。关于内存警告的唯一建议操作,无论级别如何,都要释放尽可能多的内存。 您可以使用基于report_memory函数的启发式(请参阅问题)来确定我们可以缓存多少。虽然我没有进行任何测试来计算阈值(它应该基于总RAM)。我很乐意看到有人执行这些测试并进行更新。

重置内存警告缓存页数的方法对我的情况很好。

答案 1 :(得分:0)

如果您希望尽可能多地缓存数据而不会导致应用程序崩溃,您可以随时使用函数didReceiveMemoryWarning在需要时删除多余的缓存。在此功能中,您无需清除所有内容。您可以使用它有选择地为当前情况清理足够的空间,然后继续缓存,直到它再次触发此警告。

另一种方法是启动缓存例程,直到警告触发。这将允许您创建可以缓存的项目计数。达到此计数后,您可以让缓存迭代保持在该计数之下,以避免出现问题。

不完全是一个深入的解释,但这些是使用仍然能够实现目标的标准方法的一些想法。