測試過程當中發現一個問題:個別商品,進到商詳頁,應用跑着跑着忽然Crash。打開斷點調試,也沒有具體崩潰的地方,系統就報了這個錯誤:Message from debugger: Terminated due to memory issue
.git
剛開始覺得是加載播放視頻的問題,但是其餘商品也有視頻。註釋掉視頻播放仍是會崩潰。 並且只有個別商品、在真機6p機型上崩潰😖。 對比排查最後肯定,是UIWebVIew加載HTML商詳致使程序crash。github
加載商詳描述信息的實現方法有問題。用的UIWebVIew直接加載的HTML描述信息。 原來的實現方式:商詳頁整個TableView。描述信息是一個cell,cell裏面是一個webVIew,直接用webView加載HTML描述文件。加載完成以後,更新cell高度==webView.contentSize.height;web
以前爲啥沒出現相似的崩潰? 由於這個商品描述信息太多了,加載完成以後發現webVIew的ContentSize.height = 17434!!!! 這也太大了,在App上確實不能這麼幹啊。通常商品、最新機型還能接受。可是6p 運行內存1G,屏幕又大,打開應用一多,內存直接就崩了。bash
1.更換UIWebVIew 爲 WKWebView 由於UIWebVIew自己就比較耗內存,因此更換了WKWebView。 可是在iOS 10.3.1系統上會出現加載白屏的狀況,其餘系統沒出現呢,很奇怪。 不僅是否是系統的bug。(由於iOS10系統出現過不少bug。好比:系統bug 等等不少。) 又遇上上線,就放棄了這個方法。 PS:在以後系統上直接處理下滾動方式,也能夠解決,就在iOS 10.3系統上不行。不知是否是以後系統處理優化了滾動方式。app
-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
}
複製代碼
2.由於應用會先報內存警告,而後Crash。 因此試着在報內存警告的時候釋放下內存。按照網上的方法,測試
//內存警告了
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
NSLog(@"來啦 小老弟 內存警告");
[[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@"WebKitCacheModelPreferenceKey"];
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"WebKitDiskImageCacheEnabled"];
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"WebKitOfflineWebApplicationCacheEnabled"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
//對應VC裏會內存警告
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
NSLog(@"內存警告了哈 UIApplicationDidReceiveMemoryWarningNotification ");
[[NSURLCache sharedURLCache] removeAllCachedResponses];
[[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@"WebKitCacheModelPreferenceKey"];
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"WebKitDiskImageCacheEnabled"];
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"WebKitOfflineWebApplicationCacheEnabled"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
複製代碼
這種相似的方法確實沒啥用,仍是會崩潰。優化
3.更改實現方法 將商品描述信息cell高度固定,就一個屏幕高,而後監聽滑動,當滾動到商品描述時,就讓webView滾動。當webVIew滾動到頂、底部的時候,在讓外面的tableView滾動。 具體實現方法參考:github.com/xuning0/Scr…ui