【问题标题】:best way to load an image library of iphone nsmutablearray (600+ items)加载 iphone nsmutablearray 图像库的最佳方法(600 多个项目)
【发布时间】:2010-11-01 09:21:25
【问题描述】:

我创建了一个包含图像库的应用程序。我已将图像导入到 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) 限额而导致崩溃??

我想知道是否应该执行上述代码并在选择了一个类别后将其读入数组 - 但这可能会导致它对用户停止。

有什么想法吗?!

ps) 我还需要考虑 Retina 显示屏。拥有 600 多张图像,复制它们意味着我的二进制大小会飞涨!!

【问题讨论】:

    标签: iphone memory ios4 nsmutablearray nsdictionary


    【解决方案1】:

    不久前,我为正在开发的应用程序进行了一些测试。连续加载 5000 张图片:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      600 张 HQ 图像将超过内存限制,这很浪费,因为用户在给定时间会看到多少张这些图像?资源非常有限,并且总部图像需要大量空间。

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

      【讨论】:

      • 谢谢 - 我想,我做得对。这些数组被设置为字符串 - 只有当我需要图像时,我才会说“为 objectatindex:X 绘制图像”。我主要担心的是数组需要很长时间才能填充 - 基本上会有 600 行来填充库数组 - 然后保留以供以后使用。这个练习好吗?非常感谢。
      • 以这种方式创建 600 个字符串应该不会花费很长时间,如果它出现在分析中,减少它的方法并不是非常困难。我会使用initWith... 方法来收集该大小的集合。这实际上是一种优化,因为它会减少函数中消耗的最大内存,并且需要更少的自动释放池工作。除此之外,您可以只创建一个 NSObject 子类,它代表资源路径、图像路径和标题,而不是使用字典。
      【解决方案3】:

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

      【讨论】:

      • 我原来确实有那个,但是我用相机拍照并允许用户使用它 - 我认为当我保存路径时,我必须使用路径方法中的 init ?
      • -imageNamed 会缓存图片,因此会减少加载时间。当收到内存警告时,它会释放它持有的内存。 Joshpaul 提供了有关执行时间的良好信息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      相关资源
      最近更新 更多