当前位置:  开发笔记 > 编程语言 > 正文

[UIImage imageNamed ...]和[UIImage imageWithData ...]之间的区别?

如何解决《[UIImageimageNamed]和[UIImageimageWithData]之间的区别?》经验,为你挑选了5个好方法。

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

[UIImage imageNamed:fullFileName]

要么:

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

[UIImage imageWithData:imageData];

我更喜欢第一个,因为它的代码少得多,但是我看到有些人说图像被缓存了,而且这个方法使用了更多的内存?由于我不相信大多数其他论坛上的人,我想我会在这里问这个问题,是否有任何实际的区别,如果是的话哪个更"好"?

我尝试使用对象分配工具分析我的应用程序,我看不出任何实际差异,虽然我只在模拟器中尝试过,而不是在iPhone本身上.



1> Marc Charbon..:

这取决于你对图像的处理方式.该imageNamed:方法会缓存图像,但在许多情况下,这将有助于内存使用.例如,如果将图像加载10次以与表视图中的某些文本一起显示,则UIImage将仅在内存中保留该图像的单个表示,而不是分配10个单独的对象.另一方面,如果您有一个非常大的图像并且您没有重新使用它,您可能希望从数据对象加载图像以确保在完成后从内存中删除它.

如果你没有任何巨大的图像,我不会担心它.除非你看到一个问题(并且赞成检查对象分配而不是抢先优化),否则我会选择较少的代码行而不是可忽略的内存改进.



2> Hunter..:

根据我的经验,[UIImage imageNamed:]性能会大大提高,特别是在使用时UITableViews.

它不仅仅是记忆而且还能解码image.缓存它的速度要快得多.



3> monjer..:

正如UIImage的API参考所说:

+(UIImage*)imageNamed:(NSString*)名称

此方法在系统缓存中查找具有指定名称的图像对象,并返回该对象(如果存在).如果匹配的图像对象是不是已经在高速缓存中,这种方法加载从指定的文件中的图像数据,高速缓存,然后返回生成的对象.

+(UIImage*)imageWithContentsOfFile:(NSString*)路径

此方法不缓存图像对象.

所以,我们可以看到,如果你有很多相同的UI元素(如UITableViewCell)可能使用相同的图像(通常作为图标),并且由于性能,我们当然希望重用相同的图像,这样我们就可以了将节省一些内存供其他用途.通常,重用图像通常用在我们的用户可能多次操作的ui元素中.所以它值得我们重用它.所以你可以选择使用imageNamed方法.

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


相反,在应用程序中,通常会有一些动态创建的UI元素.例如,我们的应用程序支持动态背景,以便用户可以选择他们喜欢的背景.背景可能是一个图像.所以我们可能有一个界面列出许多不同的背景(通常使用UIImageView显示)供用户选择我们可以将列表视图命名为MyBackgroundListView.因此,一旦用户选择了背景图像,MyBackgroundListView就会被销毁,因为它已经完成了它的功能.下次用户想要改变他/她的背景时,我们可以再次创建MyBackgroundListView.所以MyBackgroundListView使用的图像不应该被缓存,否则我们的应用程序的内存就会耗尽.所以这次你应该使用 imageWithContentsOfFile方法.

正如苹果公司支持高分辨率屏幕的医生所说

在具有高分辨率屏幕的设备上,imageNamed:,imageWithContentsOfFile:initWithContentsOfFile:方法会自动查找所请求图像的版本,其名称中包含@ 2x修饰符.如果找到一个,则会加载该图像.如果您未提供给定图像的高分辨率版本,则图像对象仍会加载标准分辨率图像(如果存在)并在绘图期间对其进行缩放.

所以你会担心图像的视网膜屏幕问题的搜索路径.IOS将帮助您处理它.

抱歉我的英语不好.愿它有用.



4> CedricSoubri..:

如果您不希望缓存图像,也可以直接使用initWithContentsOfFile:

NSString *fileLocation = [[NSBundle mainBundle] pathForResource:fileName ofType:extension];
UIImage* yourImage = [[[UIImage alloc] initWithContentsOfFile:imagePath] autorelease];



5> Ben Gottlieb..:

我也被告知,[UIImage imageNamed:]缓存有点过多,图像不经常发布.有人告诉我要小心使用它.


我认为这已经过时了.
推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有