3

我一直在阅读我能在这里找到的关于这个主题的所有内容,但仍然不确定最好的方法。我有一个UIImageView使用一系列脂肪UIImages作为动画循环的重物。这UIImageView是应用程序中每个屏幕的背景。(客户的要求,不是我的,所以不要讨厌。)我们已将 png 文件优化得尽可能小,但它仍然是一个相当大的负载。

我已经阅读了几篇关于如何UIImage在缓存中搜索该名称的现有图像的文章(例如,在整个应用程序中共享 UIImageView 以获取背景图像 - Singleton Property),但这似乎没有发生。我也一直在这里阅读有关单例和在 appdelegate 中实例化的信息,但我不确定其中任何一个是否是正确的继续方式。

在应用程序的整个生命周期中加载UIImageView一次并在每个视图控制器的后台使用它的最佳方法是什么?顺便说一句,因为加载需要几秒钟,我将在应用程序启动时添加一个“加载”页面,该页面使用单个静态图像和一个活动指示器。

另外,我对测试和性能工具不太熟悉。我应该使用哪一个来测试性能并确保这是导致整个应用程序犹豫不决的原因?

提前为菜鸟问题道歉——我通常完全避免提问,但有时,在这种情况下,我什至不知道从哪里开始研究。

4

1 回答 1

2

我对自己比较满意。我使用了 AppDelegate 技术,它运行良好。我在 AppDelegate 中声明了一个 UIImageView 属性,然后将图像代码添加到它的 getter:

- (UIImageView *)backgroundImageView {
    if (!_backgroundImageView) {
        NSMutableArray *tempArray = [NSMutableArray arrayWithCapacity:150];
        for (int imageNum = 0; imageNum < 150; imageNum++) {
            [tempArray addObject:[UIImage imageNamed:[NSString stringWithFormat:@"image_00%03i.png",imageNum]]];
        }
        _backgroundImageView = [[UIImageView alloc] initWithImage:[UIImage animatedImageWithImages:tempArray duration:4.0]];
    }
    return _backgroundImageView;
}

这也允许我杀死 applicationDidReceiveMemoryWarning 中的对象。

然后我创建了一个帮助类,我可以将它弹出到我所有的 UIViewController 类中:

+ (void)placeBackgroundImageUnderView:(UIView *)masterView {
    myAppDelegate *appDelegate = (myAppDelegate *)[[UIApplication sharedApplication] delegate];
    //Correct for shrinkage
    appDelegate.backgroundImageView.frame = masterView.frame;
    [masterView addSubview:appDelegate.backgroundImageView];
    [masterView sendSubviewToBack:appDelegate.backgroundImageView];
}

这允许我在每个 viewDidLoad 方法中添加一行:

[HelperClass placeBackgroundImageUnderView:self.view];

问题是,仅使用 UIImage 就应该缓存整个内容并加快加载时间。但似乎不时需要重新加载图像 - 内存问题?因此,这允许我通过实例化对象一次并使用同一个对象来更好地控制它,同时还可以将该对象设置为 nil 以在需要时释放内存。

自从添加它以来,整个应用程序的加载速度要快得多。我添加了一个额外的加载屏幕,其中包含一个用于初始加载的活动指示器(也可以很好地工作),之后的一切都是即时的。

于 2013-01-04T14:27:50.163 回答