【发布时间】:2014-06-27 17:22:58
【问题描述】:
我正在尝试从捆绑包中加载 100 多个图像,但最近我只是好奇从捆绑包中动态加载图像的最佳做法是什么。自定义 Images.xcassets 是否允许我执行此类任务?如何动态加载 NSArray?
【问题讨论】:
标签: ios objective-c cocoa-touch ios7 ios6
我正在尝试从捆绑包中加载 100 多个图像,但最近我只是好奇从捆绑包中动态加载图像的最佳做法是什么。自定义 Images.xcassets 是否允许我执行此类任务?如何动态加载 NSArray?
【问题讨论】:
标签: ios objective-c cocoa-touch ios7 ios6
首先我会推荐我的答案,不要这样做。
对于您的应用来说,一次加载 100 张图像并将它们存储在内存中确实有点过头了,而且应用肯定会承受一定的内存压力。
在 Xcode 5 中,.xcassets 仍然是将图像保存在 app bundle 中的最佳位置。有关更多详细信息,您可能对Apple Asset Catalog 文档感兴趣。但是,我建议您将它们的标识符(实际上是添加到 .xcassets 的图像名称)存储在数组中,而不是将图像加载和存储到 NSArray。如果您事先将图像标识符存储到一些NSString* const 也会很有帮助。
所以你的编码结构应该如下所示:
//image names
NSString* const kImage1 = @"image1";
NSString* const kImage2 = @"image2";
NSString* const kImage3 = @"image3";
//...etc
NSArray* imageIdentifiers = @[kImage1, kImage2, kImage3,...];
//...
然后从你可以使用的包中加载单个图像:
UIImage* img = [UIImage imageNamed:kImage3]; //loads image3 from bundle and caches
或遍历您可能使用的所有图像:
for (NSString* identifier in imageIdentifiers) {
@autoreleasepool { //make sure your image data gets disposed after use
UIImage* img = [UIImage imageNamed:identifier];
//... use img, etc.
}
}
最后,UIImage 类的imageNamed: 方法将图像缓存在系统缓存中。因此,如果您重复使用一个文件,您就不必担心从文件中重新加载它。
【讨论】:
[[NSFileManager defaultManager] contentsOfDirectoryAtPath:<# your path #> error:NULL]; 将目录的内容放入数组中,并使用UIImage 类的imageWithContentsOfFile: 方法从那里加载图像,同时枚举数组。但该过程与资源加载无关。您通常需要该方法来加载瞬态图像。