我创建了一个包含图片库的应用。我已经将图像导入到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多张图片,复制它们意味着我的二进制大小会火箭!
答案 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]?它内部有很好的内存管理。