我在xcassets中有大约120张图片,我想用UIImage创建(或者如果你有更好的方法,还有别的东西)当我启动我的应用程序并在应用程序的任何地方都可以使用它们,因为它们不会改变我可能需要多次。
我正在考虑在我的主视图的viewDidLoad中创建它们,但是如何在不创建结构然后创建静态变量的情况下将它们提供给任何视图控制器?这可能吗?
那里最好的做法是什么?
感谢您的帮助。
更新 :
问题在于我有一个允许用户选择国家/地区列表的视图。每个国家/地区由标签和图像(标志,小于10KB)表示。在应用程序的生命周期中,可能会多次访问此视图。这就是为什么我想在我创建UIImages时将它们存储在某个地方,这样我每次进入该视图时都不必再创建它们。但实际上,我应该不是在应用程序的开头创建它们,而是在第一次加载我的视图时。
答案 0 :(得分:1)
在iPhone / iPad等移动设备上(硬件功能相对有限),建议不要提前初始化所有应用资源;相反,最好做'延迟初始化',例如仅加载图片如果, 时需要加载图片。特别是如果它有多达120个图像(这不仅仅是我的意见,而是Apple自己提出的“最佳实践”,并且被大多数iOS开发人员所遵守)。
关于在应用程序的任何位置使它们可用,如果你使用系统提供的加载机制和上面描述的延迟初始化策略,那么没有什么特别的事情要做:只需调用(例如)-[UIImage imageNamed:]
(在你的情况下) ,来自相关位置的快速等价物。
如果-instead-您仍然希望尽早“预加载”所有图像并保持缓存,则可以使用单个对象并将其命名为类ImageManager
或类似的东西。
在任何情况下,你都应该平衡你所获得的小速度,而不是按需加载图像,而不是一直放在应用程序上的内存压力。
当然,如果每个图像非常小(如@Rob建议的那样),您可以在内存使用方面侥幸逃脱。
编辑 - 找到实际需要图像的代码位置(用于显示目的或其他方式),并在那里插入方法调用以加载这些图像。请参阅下面的示例(抱歉,它位于Objective-C,而不是swift):
// Example
// Custom UIViewController subclass that controls one of your app's screens
// where an image is needed.
- (void) viewDidLoad
{
[super viewDidLoad];
/* Lazy initialization: load image just before it is needed,
not earlier.
*/
UIImage* myImage = [UIImage imageNamed:@"MyImage"];
// Note: imageNamed: caches the images it loads. If you call it
// again later with the same image name, and it is still in memory,
// it will use that instance instead of loading the file again from
// disk.
UIImageView* myImageView = [[UIImageView alloc] initWithImage:myImage];
[self.view addSubview: myImageView];
}