2011-12-27 104 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