代码之家  ›  专栏  ›  技术社区  ›  rustyshelf

[UIImage imageNamed…]和[UIImage imageWithData…]之间的差异?

  •  64
  • rustyshelf  · 技术社区  · 17 年前

    我想将一些图像从文件系统加载到我的应用程序中。有两种简单的方法可以做到这一点:

    [UIImage imageNamed:fullFileName]
    

    NSString *fileLocation = [[NSBundle mainBundle] pathForResource:fileName ofType:extension];
    NSData *imageData = [NSData dataWithContentsOfFile:fileLocation];
    
    [UIImage imageWithData:imageData];
    

    我更喜欢第一种方法,因为它的代码要少得多,但是我看到一些人说图像是缓存的,并且这种方法使用了更多的内存?因为我不信任其他大多数论坛上的人,所以我想在这里问一个问题,有没有实际的区别,如果有,哪一个更好?

    我曾尝试使用对象分配工具分析我的应用程序,但我看不出任何实际的区别,尽管我只是在模拟器中尝试过,而不是在iPhone上。

    8 回复  |  直到 13 年前
        1
  •  91
  •   Marc Charbonneau    17 年前

    这取决于您对图像所做的操作。这个 imageNamed: 方法确实缓存了图像,但在许多情况下,这将有助于内存的使用。例如,如果加载一个图像10次以在表视图中显示某些文本,UIImage将只在内存中保留该图像的一个表示形式,而不是分配10个单独的对象。另一方面,如果您有一个非常大的图像,并且您没有在使用它,那么您可能希望从数据对象加载该图像,以确保在完成后将其从内存中删除。

    如果你没有任何巨大的图像,我不会担心的。除非您看到问题(以及检查对象分配而不是抢先优化的荣誉),否则我会选择更少的代码行,而不是微不足道的内存改进。

        2
  •  10
  •   Girish    13 年前

    以我的经验 [UIImage imageNamed:] 具有显著更好的性能,尤其是在 UITableViews

    image . 缓存它要快得多。

        3
  •  10
  •   monjer    13 年前

    作为API的参考 说:

    此方法在系统缓存中查找具有指定名称的图像对象,并返回该对象(如果存在)。如果匹配的图像对象不在缓存中,此方法将从指定的文件加载图像数据,对其进行缓存,然后返回结果对象。

    +(UIImage*)包含文件内容的图像:(NSString*)路径

    此方法不缓存图像对象。

    UI元素 (例如UITableViewCell)可以使用相同的图像(通常作为 ),并且由于性能原因,我们当然希望重用 相同的图像 ,这样我们将节省一些内存供其他使用。总的来说 通常在用户可以对其进行操作的ui元素中使用 很多次 . 所以我们可以重用它,所以你可以选择使用它 图像命名

    另一方面,在应用程序中,会有一些 UI元素 这将在应用程序的生命周期中出现,例如按钮、徽标视图,因此这些UI元素所使用的这些图像也可能在应用程序的生命周期中存在,您不会考虑这些图像是否应该缓存。因此,您可以选择使用。 图像命名 方法


    相反,在应用程序中,通常有 用户界面元素 这是动态创建的。例如,我们的应用程序支持动态 出身背景 ,以便用户可以选择他们喜欢的背景 出身背景 出身背景 (通常通过使用来显示 )用户可以选择,我们可以命名列表视图 。因此,一旦用户选择了背景 形象 这个 MyBackgroundListView 应该销毁,因为它已完成其功能。下次用户想要更改其背景时,我们可以创建 图像 被使用 MyBackgroundListView 不应该被缓存,否则我们的应用程序的内存将耗尽 imageWithContentsOfFile 方法

    作为苹果的医生 Supporting High-Resolution Screens In Views 说

    在具有高分辨率屏幕的设备上 图像名称: , imageWithContentsOfFile: 和 initWithContentsOfFile:

    因此,您可能会担心图像的视网膜屏幕搜索路径问题。IOS将帮助您处理此问题。

    对不起,我的英语很差。希望对你有帮助。

        4
  •  7
  •   CedricSoubrie    15 年前

    NSString *fileLocation = [[NSBundle mainBundle] pathForResource:fileName ofType:extension];
    UIImage* yourImage = [[[UIImage alloc] initWithContentsOfFile:imagePath] autorelease];
    
        5
  •  5
  •   Ben Gottlieb    17 年前

    我也听说过 [UIImage imageNamed:]

        6
  •  3
  •   Dan    17 年前

    imageWithData在将图像二进制存储在数据库中或从web逐步下载大型图像时非常有用。

        7
  •  0
  •   user281300    15 年前

        8
  •  -11
  •   andrew    15 年前

    我根本不相信图像会被缓存,我也不知道你们为什么这么说。UIImage是NSObject的一个子类,它使用引用计数器跟踪与其相关的事物。所以当你加载一个图像时,它也会做同样的事情。如果多次加载同一图像,它将(或应该)在内存中只有一个图像副本,并且每次必须使用该图像时,只需增加引用计数器。通过引用计数器,我的意思是当计数达到0时,它会删除自身。因此,“alloc”、“retain”分别是计数的+1,“release”是-1。这不仅是一种更好的内存管理方式,而且这种编程方式还有助于清除内存泄漏。