加载iphone nsmutablearray图像库的最佳方法(600多项)

时间:2010-11-01 09:21:26

标签: iphone memory ios4 nsmutablearray nsdictionary

我创建了一个包含图片库的应用。我已经将图像导入到Xcode中的资源文件夹中,并且当应用程序加载时我正在将它们加载到appDelegate中的数组中。这种情况每次都在发生。我现在担心随着库的增长,应用程序将耗尽内存。有没有更好的方法加载这些?

结构是

图书馆>类别>图像列表>图像

我有一个名为mainLibrary的NSMutableArray,然后我为每个类别添加另一个nsmutablearray。例如

NSMutableArray *arrHome = [[NSMutableArray alloc] initWithObjects:  @"Home",                           
    [NSDictionary dictionaryWithObjectsAndKeys: [NSString stringWithFormat:@"%@/%@", resourcePath, @"alarm_clock.png"], @"image_path", @"Alarm Clock", @"title", nil],
    [NSDictionary dictionaryWithObjectsAndKeys: [NSString stringWithFormat:@"%@/%@", resourcePath, @"bathtub.png"], @"image_path",@"Bathtub", @"title", nil],

    nil];
[mainLibrary addObject: arrHome];

以上是“家庭”类别,仅包含两张图片。对于其他类别,我为每个图像都有NSDictionary行 - 每个类别最多可以有100个图像。

如果我将50mb +的图像加载到数组中,这会导致应用程序无响应 - 或者更可能的是,因为每个应用程序使用更多的24mb(ish)容量而导致崩溃?

我想知道我是否应该执行上面的代码并读入数组ONCE已经选择了一个类别 - 但这可能会导致它为用户停止。

有什么想法吗?!

ps)我还需要考虑一下Retina的显示效果。有600多张图片,复制它们意味着我的二进制大小会火箭!

3 个答案:

答案 0 :(得分:2)

前段时间我为我正在处理的应用程序运行了一些测试。连续加载5000张图片:

[UIImage imageWithData:...] // 44.8秒

[UIImage imageWithContentsOfFile:...] // 52.3秒

[[UIImage alloc] initWithContentsOfFile:…] // 351.8秒

[UIImage imageNamed:...] //由于缓存而挂起

使用文件路径显然是要走的路。显然,内存管理将是您的关键。

答案 1 :(得分:1)

使用字符串组成路径字典/数组,然后根据需要加载/卸载图像(懒惰地加载),如果您需要这样的结构来与程序中的接口进行。

600 HQ图像将超出内存限制,这是浪费,因为用户将在给定时间看到这些图像中有多少?资源非常有限,而且hq图像需要很大的空间。

如果你必须显示一堆缩略图,那么这些缩略图可以缩小并轻松导出,这样你就可以在合理的时间内显示所有图像,同时使用合理的内存量(再次,只是在可能的情况下懒得加载)并且在不容易看到时释放图像。)

答案 2 :(得分:0)

为什么不直接使用[UIImage imageNamed:IMAGE_NAME]?它内部有很好的内存管理。