测试过程当中发现一个问题:个别商品,进到商详页,应用跑着跑着忽然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系统上不行。不知是否是以后系统处理优化了滚动方式。markdown
-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
}
复制代码
2.由于应用会先报内存警告,而后Crash。 因此试着在报内存警告的时候释放下内存。按照网上的方法,app
//内存警告了 - (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]; } 复制代码
这种相似的方法确实没啥用,仍是会崩溃。oop
3.更改实现方法 将商品描述信息cell高度固定,就一个屏幕高,而后监听滑动,当滚动到商品描述时,就让webView滚动。当webVIew滚动到顶、底部的时候,在让外面的tableView滚动。 具体实现方法参考:github.com/xuning0/Scr…测试