iOS7 / iOS8中[UIImage imageNamed]的性能问题

时间:2014-10-28 16:44:13

标签: objective-c performance ios7 uiimage ios8

我有一个应用程序,我正在从iOS6更新到iOS8。在这里和那里做了一些小的改动以便编译后,我在我的iPad mini上运行应用程序,发现性能大幅下降。在一些地方,过去没有明显延迟的事情现在经常需要2-3秒才能完成。想到我的iPad可能出了问题,我删除了当前版本并从AppStore重新下载了应用程序。表现又恢复到以前的状态。

在对代码进行分析之后,其中一个突出的事情是[UIImage imageNamed]中的大量时间。我的应用程序对此进行了多次调用,因为它具有室内和室外模式,需要动态加载给定视图上的大多数图像。在最新的SDK中,此调用发生了什么变化?

当我分析应用程序时,这里的方法正在消耗大约70%的时间

+(UIImage*)imageNamed:(NSString*)rootName extension:(NSString*)extension
{
    NSString* typeName = _isIndoor ? @"inside" : @"outside";
    NSString* fullName = [NSString stringWithFormat:@"%@-%@.%@", rootName, typeName, extension];
    UIImage* result = [UIImage imageNamed:fullName];

    if (result == nil) {
        NSLog(@"Missing image [name: %@]", fullName);
    }

    return result;
}

其他一些说明:

  1. 原始应用程序适用于运行iOS8的第一代iPad Mini
  2. 该应用程序目前不使用ARC,但我测试切换到ARC没有改进(不足为奇)
  3. 该应用不使用资产目录,但我尝试转换为使用资产目录,没有任何改进(也不奇怪)
  4. 我做了一些谷歌搜索,但是找不到其他人有同样的问题

1 个答案:

答案 0 :(得分:1)

我认为[UIImage imageNamed:]占用的时间最多。在我们猜测“搜索”部分出现问题之前,我认为事情进展顺利。资源存储在哪里?主捆或其他地方?

此外,imageNamed:应该缓存图像,快速进行后续调用。是这样的吗?或者对同一资源的后续调用也是如此?

尝试在NSImage上使用带有inBundle参数的init方法,并将正确的bundle传递给它。这样,如果搜索文件是问题,这应该更快。