iOS 面試題之加載單張圖片到底會不會崩潰?

今天,一哥們去某公司面試iOS職位。其中一道題目問,加載一張圖片,到底會不會崩潰呢?面試

我拿到這個問題,當時覺得是獲取網絡圖片,那仍是可能崩潰的,但實際問題,還有半句,圖片是本地的。。。數組

這問題,加載本地的怎麼會崩潰呢?寫這麼久加載圖片也沒遇到如此問題。緩存

===================================================網絡

原來,iPhone畢竟是手持設備,它所佔有的內存是有限的,當圖片過大的時候會引發內存致使的崩潰現象。app

IPhone下每一個app可用的內存是被限制的,若是一個app使用的內存超過20M,則系統會向該app發送Memory Warning消息。收到此消息後,app必須正確處理,不然可能出錯或者出現內存泄露。動畫

app收到Memory Warning後會調用:指針

UIApplication::didReceiveMemoryWarning -> UIApplicationDelegate::applicationDidReceiveMemoryWarning,而後調用當前全部的viewController進行處理。所以處理的主要工做是在viewController。code

建立viewcontroller時,執行順序是loadview -> viewDidLoad。對象

當收到內存警告時,若是viewcontroller未顯示(在後臺),會執行didReceiveMemoryWarning -> viewDidUnLoad;若是viewcontroller當前正在顯示(在前臺),則只執行didReceiveMemoryWarning。圖片

當從新顯示該viewController時,執行過viewDidUnLoad的viewcontroller(即原來在後臺)會從新調用loadview -> viewDidLoad。

後來,我又查了下,發現,原來還有這麼大學問。

Apple官方的文檔爲生成一個UIImage對象提供了兩種方法加載圖片:
1. imageNamed,其參數爲圖片的名字;
2. imageWithContentsOfFile,其參數也是圖片文件的路徑。
那麼兩種有什麼區別嗎?
確定是有的。根據Apple的官方文檔:
imageNamed: 這個方法用一個指定的名字在系統緩存中查找並返回一個圖片對象若是它存在的話。若是緩存中沒有找到相應的圖片,這個方法從指定的文檔中加載而後緩存並返回這個對象。所以imageNamed的優勢是當加載時會緩存圖片。因此當圖片會頻繁的使用時,那麼用imageNamed的方法會比較好。例如:你須要在 一個TableView裏的TableViewCell裏都加載一樣一個圖標,那麼用imageNamed加載圖像效率很高。系統會把那個圖標Cache到內存,在TableViewCell裏每次利用那個圖像的時候,只會把圖片指針指向同一塊內存。正是所以使用imageNamed會緩存圖片,即將圖片的數據放在內存中,iOS的內存很是珍貴而且在內存消耗過大時,會強制釋放內存,即會遇到memory warnings。而在iOS系統裏面釋放圖像的內存是一件比較麻煩的事情,有可能會形成內存泄漏。例如:當一個UIView對象的animationImages是一個裝有UIImage對象動態數組NSMutableArray,並進行逐幀動畫。當使用imageNamed的方式加載圖像到一個動態數組NSMutableArray,這將會頗有可能形成內存泄露。緣由很顯然的。
imageWithContentsOfFile:僅加載圖片,圖像數據不會緩存。所以對於較大的圖片以及使用狀況較少時,那就能夠用該方法,下降內存消耗。
下面列舉出兩種方法的詳細用法:
NSString *path = [[NSBundle mainBundle] pathForResource:@」icon」 ofType:@」png」];
UIImage *image = [UIImage imageWithContentsOfFile:path];

 NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:「png」];
 NSData *image = [NSData dataWithContentsOfFile:filePath];
 UIImage *image = [UIImage imageWithData:image]; //or = [UIImage imageWithContentsOfFile:filePath];

 

關鍵,在於

imageWithContentsOfFile:僅加載圖片,圖像數據不會緩存

 

imageNamed:先將圖片緩存到內存中,而後在顯示。

 

====================================================

之後即爲題目的解答,分析應該是八九不離十了,若是大家有不懂的意見,能夠告訴我哈,互相進步。

相關文章
相關標籤/搜索