UIImage *img = [[UIImage alloc] initWithContentsOfFile:@"xx.jpg"]
UIImage *img = [UIImage imageNamed:@"xx.jpg"]
在第二种类型中,图片会被缓存吗? 而在第一种类型中,图片不会被缓存?
UIImage *img = [[UIImage alloc] initWithContentsOfFile:@"xx.jpg"]
UIImage *img = [UIImage imageNamed:@"xx.jpg"]
-initWithContentsOfFile:
方法创建新的图片时不使用缓存,这是一种普通的初始化方法。
+imageNamed:
方法使用缓存。以下是来自 UIImage 参考文档 的说明:
该方法在系统缓存中查找指定名称的图像对象,并返回该对象(如果存在)。如果匹配的图像对象尚未在缓存中,则此方法从指定文件加载图像数据、缓存它,然后返回结果对象。
UIImage 会保留已加载的图像,使其保持活动状态,直到低内存条件导致缓存被清除。
Swift 更新:
在 Swift 中,UIImage(named: "...")
函数是使用缓存的函数。
我想在这里分享一些有关路径名问题的解决方法。这是一个可以放在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;
}
newName = [[NSBundle mainBundle] pathForResource:[name stringByDeletingPathExtension] ofType:[name pathExtension]];
和 UIImage *retVal = [[UIImage alloc] initWithContentsOfFile:newName];
。 - lnafzigerpathForResource
不会检查@2x。否则,这是一个很好的解决方案。 - Joel@Dan Rosenstark 用Swift回答...
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
}
}
没错,第二个项目已被缓存。