UIImagecaching图像?

UIImage *img = [[UIImage alloc] initWithContentsOfFile:@"xx.jpg"] UIImage *img = [UIImage imageNamed:@"xx.jpg"] 

在第二种types的图像会被caching?
而在第一种types的图像不会被caching?

  • -initWithContentsOfFile:创build一个没有caching的新图像,这是一个普通的初始化方法。

  • +imageNamed:方法使用caching。 这里是UIImage Reference的一个文档:

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

    UIImage将保留已加载的映像,使其保持活动状态,直到内存不足情况导致高速caching被清除。

更新Swift:在Swift中, UIImage(named: "...")函数是caching图像的函数。

只是想在这里留下来帮助处理path名称问题。 这是一种可以放在UIImage类别上的方法。

 +(UIImage *)imageNamed:(NSString *)name cache:(BOOL)cache { if (cache) return [UIImage imageNamed:name]; name = [[NSBundle mainBundle] pathForResource:[name stringByDeletingPathExtension] ofType:[name pathExtension]]; UIImage *retVal = [[UIImage alloc] initWithContentsOfFile:name]; return retVal; } 

如果你没有一个简单的方法切换到caching,你可能会最终使用`imageNamed。 在大多数情况下这是一个很大的错误。 看到这个伟大的答案更多的细节 (和upvote问题和答案!)。

@ 丹·罗森斯塔克迅速回答..

 extension UIImage { static func imageNamed(name: String, cache: Bool) -> UIImage? { if (cache) { return UIImage(named: name) } // Using NSString for stringByDeletingPathExtension let fullName = NSString(string: name) let fileName = fullName.stringByDeletingPathExtension let ext = fullName.pathExtension let resourcePath = NSBundle.mainBundle().pathForResource(fileName, ofType: ext) if let path = resourcePath { return UIImage(contentsOfFile: path) } return nil } } 

正确,第二项被caching。