我想从文件系统将一些图像加载到我的应用程序中.有两种简单的方法可以做到这一点:
[UIImage imageNamed:fullFileName]
要么:
NSString *fileLocation = [[NSBundle mainBundle] pathForResource:fileName ofType:extension]; NSData *imageData = [NSData dataWithContentsOfFile:fileLocation]; [UIImage imageWithData:imageData];
我更喜欢第一个,因为它的代码少得多,但是我看到有些人说图像被缓存了,而且这个方法使用了更多的内存?由于我不相信大多数其他论坛上的人,我想我会在这里问这个问题,是否有任何实际的区别,如果是的话哪个更"好"?
我尝试使用对象分配工具分析我的应用程序,我看不出任何实际差异,虽然我只在模拟器中尝试过,而不是在iPhone本身上.
这取决于你对图像的处理方式.该imageNamed:
方法会缓存图像,但在许多情况下,这将有助于内存使用.例如,如果将图像加载10次以与表视图中的某些文本一起显示,则UIImage将仅在内存中保留该图像的单个表示,而不是分配10个单独的对象.另一方面,如果您有一个非常大的图像并且您没有重新使用它,您可能希望从数据对象加载图像以确保在完成后从内存中删除它.
如果你没有任何巨大的图像,我不会担心它.除非你看到一个问题(并且赞成检查对象分配而不是抢先优化),否则我会选择较少的代码行而不是可忽略的内存改进.
根据我的经验,[UIImage imageNamed:]
性能会大大提高,特别是在使用时UITableViews
.
它不仅仅是记忆而且还能解码image
.缓存它的速度要快得多.
正如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将帮助您处理它.
抱歉我的英语不好.愿它有用.
如果您不希望缓存图像,也可以直接使用initWithContentsOfFile:
NSString *fileLocation = [[NSBundle mainBundle] pathForResource:fileName ofType:extension]; UIImage* yourImage = [[[UIImage alloc] initWithContentsOfFile:imagePath] autorelease];
我也被告知,[UIImage imageNamed:]
缓存有点过多,图像不经常发布.有人告诉我要小心使用它.