2010-11-01 66 views
0

我已经创建了一个应用程序,它有一个图像库。我已经将图像导入到Xcode中的资源文件夹中,并且当应用程序加载时,它们当前将它们加载到appDelegate中的数组中。每次都发生这种情况。我现在担心,随着图书馆的发展,应用程序将耗尽内存。有没有更好的方法来加载这些?加载iphone nsmutablearray图像库的最佳方式(600+项目)

结构是

库>类别>图像列表>图像

我有一个NSMutableArray称为mainLibrary我然后添加另一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)配额而导致崩溃?

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

有什么想法?

ps)我还需要对Retina显示器有一个想法。 600多个图像,复制它们意味着我的二进制大小会火箭!

回答

1

使用字符串组合您的路径字典/数组,然后根据需要加载/卸载图像(延迟加载),如果您需要这样的结构在程序中进行对接。

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

如果您必须显示一堆缩略图,那些缩略图可能会缩小并导出足够容易,这样您可以在合理的时间内显示所有图像,同时使用合理数量的内存(同样,只需加载可能并在不太容易查看时释放图像)。

+0

谢谢 - 我认为,我正确地做到了。这些数组被设置为字符串 - 只有当我需要图像时,我才会说“为objectatindex:X绘制图像”。我主要关心的是数组花费时间来填充 - 基本上有600行来填充库数组 - 然后保留以供以后使用。这种做法行得通吗?非常感谢。 – 2010-11-01 10:49:50

+0

以这种方式创建600个字符串不应该花费太长时间,而且如果它在分析中显示的话,减少它的方法并不是非常困难。我会使用'initWith ...'方法来处理这个大小的集合。这实际上是一个优化,因为它会减少函数中消耗的最大内存,并且会减少autorelease池中的工作量。除此之外,您可以创建一个代表resourcePath,imagePath和title的NSObject子类,而不是使用字典。 – justin 2010-11-01 11:08:25

0

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

+0

本来我确实有这个,但我使用相机拍照,并允许用户使用 - 我认为,因为我正在保存路径,我不得不使用init从路径方法? – 2010-11-01 09:46:59

+0

-imageNamed将缓存图像,所以它会减少加载时间。当接收到内存警告时,它会释放它保存的内存。 Joshpaul提供有关执行时间的良好信息。 – AechoLiu 2010-11-01 23:08:05

2

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

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

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

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

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

使用文件路径显然是最佳选择。显然,内存管理将是你的案例的关键。