iOS載入單張圖片導致崩潰的分析
1、初步分析
首先iPhone畢竟是手持裝置,它所佔有的記憶體是有限的,當圖片過大的時候會引起記憶體導致的崩潰現象。
iPhone下每個app可用的記憶體是被限制的,如果一個app使用的記憶體超過20M,則系統會向該app傳送Memory Warning訊息。收到此訊息後,app必須正確處理,否則可能出錯或者出現記憶體洩露。
2、崩潰執行的過程分析
app收到Memory Warning後會呼叫:
UIApplication::didReceiveMemoryWarning -> UIApplicationDelegate::applicationDidReceiveMemoryWarning,然後呼叫當前所有的viewController進行處理。因此處理的主要工作是在viewController。
建立viewcontroller時,
執行順序是loadview -> viewDidLoad。
當收到記憶體警告時,
如果viewcontroller未顯示(在後臺),會執行didReceiveMemoryWarning -> viewDidUnLoad;如果viewcontroller當前正在顯示(在前臺),則只執行didReceiveMemoryWarning。
當重新顯示該viewController時,
執行過viewDidUnLoad的viewcontroller(即原來在後臺)會重新呼叫loadview -> viewDidLoad。
3、圖片載入的方法分析
**仔細檢視Apple官方的文件,可見其為生成一個UIImage物件提供了兩種方法載入圖片:
**
- imageNamed,其引數為圖片的名字;
- imageWithContentsOfFile,其引數也是圖片檔案的路徑。
這兩者是有區別的,根據Apple的官方文件:imageNamed: 這個方法用一個指定的名字在系統快取中查詢並返回一個圖片物件,如果它存在的話。如果快取中沒有找到相應的圖片,這個方法從指定的文件中載入然後快取並返回這個物件。
因此imageNamed的優點是當載入時會快取圖片。所以當圖片會頻繁的使用時,那麼用imageNamed的方法會比較好。
例如:你需要在 一個TableView裡的TableViewCell裡都載入同樣一個圖示,那麼用imageNamed載入影象效率很高。系統會把那個圖示Cache到記憶體,在TableViewCell裡每次利用那個影象的時候,只會把圖片指標指向同一塊記憶體。正是因此使用imageNamed會快取圖片,即將圖片的資料放在記憶體中,iOS的記憶體非常珍貴並且在記憶體消耗過大時,會強制釋放記憶體,即會遇到memory warnings。
而在iOS系統裡面釋放影象的記憶體是一件比較麻煩的事情,有可能會造成記憶體洩漏。
例如:當一個UIView物件的animationImages是一個裝有UIImage物件動態陣列NSMutableArray,並進行逐幀動畫。當使用imageNamed的方式載入影象到一個動態陣列NSMutableArray,這將會很有可能造成記憶體洩露,原因很顯然的。
imageWithContentsOfFile:僅載入圖片,影象資料不會快取。
因此對於較大的圖片以及使用情況較少時,那就可以用該方法,降低記憶體消耗。
//下面列舉出兩種方法載入UIImage的用法:
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:先將圖片快取到記憶體中,然後在顯示。
最後,再次強調兩種用法各有各的優點,需要針對具體的應用場景來使用才能恰到好處。
相關文章
- iOS開發-stringByEvaluatingJavaScriptFromString導致崩潰iOSJavaScript
- 單張圖片懶載入
- SDWebImage載入多個圖片記憶體崩潰的問題Web記憶體
- IOS 崩潰日誌分析iOS
- A站大流量導致服務崩潰異常分析
- 執行緒崩潰為什麼不會導致 JVM 崩潰執行緒JVM
- 圖形化還原崩潰地址 iOS的crash檔案分析iOS
- 蘋果iOS 11.3/11.4曝bug:“黑點錯誤”導致裝置崩潰蘋果iOS
- 記一次 .NET某工控 宇宙射線 導致程式崩潰分析
- 實現簡單的輪播圖(單張圖片、多張圖片)
- iOS Crash不崩潰iOS
- 誤升級GLIBC導致系統崩潰之後
- 模態對話方塊可能導致程式崩潰
- js:原生多張圖片延遲載入(圖片自己找)JS
- 儲存崩潰導致資料丟失如何處理
- 手把手教你檢視和分析iOS的crash崩潰iOS
- iOS開發的底線-崩潰iOS
- 記錄一個LifeCycle 多執行緒使用導致的崩潰執行緒
- Spring Boot MVC 單張圖片和多張圖片上傳 和通用檔案下載Spring BootMVC
- iOS 避免常見崩潰(二)iOS
- iOS 避免常見崩潰(一)iOS
- 微軟修復了導致 Outlook 啟動時崩潰的問題微軟
- HttpClient引發的執行緒數過多導致應用崩潰HTTPclient執行緒應用崩潰
- 案例解析:執行緒池使用不當導致的系統崩潰執行緒
- memcopy 導致的程式碼崩潰問題,memcpy的三大踩坑記memcpy
- Fresco圖片載入的簡單應用
- 伺服器磁碟離線導致RAIDZ崩潰資料恢復伺服器AI資料恢復
- node啟動程式-清理由於崩潰導致的沒有關掉的程式
- 圖片載入框架Picasso - 原始碼分析框架原始碼
- 圖片載入框架Picasso原始碼分析框架原始碼
- alicdn邊緣節點不穩定導致頁面崩潰問題
- 多塊硬碟離線導致raid6崩潰的資料恢復案例硬碟AI資料恢復
- iOS8 Framework使用載入xib及圖片iOSFramework
- 解決Qt中ui->tableView->setModel(model);導致程式崩潰 問題QTUIView
- lol關於win10系統導致閃退崩潰修復方法Win10
- 分享cropper剪下單張圖片demo
- bugku的圖片隱寫1 這是一張單純的圖片
- iOS相關 | Xcode8 ---- iOS 9.2 崩潰問題iOSXCode
- iOS效能優化 - 網路圖片載入優化iOS優化