4

我有一个缓存大图像的应用程序,这样用户就不用等待 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 会导致崩溃。

4

2 回答 2

0

因此,在等待了这么久之后,我正在回答我的问题,如果它可能对某人有帮助。

您应该避免使用任何未记录的 API 来获得警告级别并据此采取行动。无论级别如何,对内存警告的唯一建议操作是尽可能多地释放内存。您可以使用基于 report_memory 函数的启发式方法(参见问题)来确定我们可以缓存多少。虽然我没有执行任何测试来计算阈值(它应该基于总 RAM)。我很想看到有人执行这些测试和更新。

在我的情况下,在内存警告中重置要缓存的页数的方法效果很好。

于 2012-08-03T10:00:14.007 回答
0

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

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

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

于 2012-08-30T17:55:21.843 回答