2011-12-27 76 views
19
UIImage *img = [[UIImage alloc] initWithContentsOfFile:@"xx.jpg"] 
UIImage *img = [UIImage imageNamed:@"xx.jpg"] 

在第二种类型中图像会被缓存吗?
而在第一种类型的图像不会被缓存?是否UIImage缓存图像?

回答

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

  • +imageNamed:方法使用缓存。这里是从UIImage Reference的文档:

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

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

更新夫特: 在夫特的UIImage(named: "...")功能是缓存的图像之一。

+0

将高速缓存使用导致了额外的资源还是会只是一个指针,它指向的对象? – raghul 2011-12-27 13:17:51

+1

@raghul UIImage将保留您现有的图像,并在释放它之后保持活动状态,直到内存不足情况导致高速缓存被清除。 – iHunter 2011-12-27 13:29:50

+0

谢谢ihunter !!! – raghul 2011-12-27 13:33:11

0

正确,第二项被缓存。

9

只是想离开这里来帮助处理路径名问题。这是一种可以放在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; 
} 

如果您没有简单的方法切换到缓存,最终可能会使用`imageNamed。在大多数情况下这是一个很大的错误。请参阅this great answer for more details(并提出问题和答案!)。

+1

如果你希望这不会中断,如果有多个句点,你可以使用'newName = [[NSBundle mainBundle] pathForResource:[name stringByDeletingPathExtension ] ofType:[name pathExtension]];'和'UIImage * retVal = [[UIImage alloc] initWithContentsOfFile:newName];' – lnafziger 2012-12-25 17:23:12

+1

谢谢,很棒! – 2012-12-25 17:42:27

+1

注意:如果bundle中只包含* 2x @版本的图像,则会因为pathForResource不会检查@ 2x而中断。否则,很好的解决方案 – Joel 2014-09-08 17:05:30

1

@丹Rosenstark答案迅速..

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 
    } 
} 
+0

谢谢你的呐喊! – 2016-09-19 18:27:50