UIWebDocumentView _updateSubviewCaches在iOS10中崩溃
问题描述:
我在iOS10中更加严重地在HockeyApp中发生以下崩溃。请找到下面给出的崩溃日志。UIWebDocumentView _updateSubviewCaches在iOS10中崩溃
主题4毁损:
0 libobjc.A.dylib 0x0000000187242f30 objc_msgSend + 16
1 UIKit 0x000000018e86e914 -[UIWebDocumentView _updateSubviewCaches] + 36
2 UIKit 0x000000018e69093c -[UIWebDocumentView subviews] + 88
3 UIKit 0x000000018e941bd4 -[UIView(CALayerDelegate) _wantsReapplicationOfAutoLayoutWithLayoutDirtyOnEntry:] + 68
4 UIKit 0x000000018e63d770 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1248
5 QuartzCore 0x000000018bb0640c -[CALayer layoutSublayers] + 144
6 QuartzCore 0x000000018bafb0e8 CA::Layer::layout_if_needed(CA::Transaction*) + 288
7 QuartzCore 0x000000018bafafa8 CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 28
8 QuartzCore 0x000000018ba77c64 CA::Context::commit_transaction(CA::Transaction*) + 248
9 QuartzCore 0x000000018ba9f0d0 CA::Transaction::commit() + 508
10 QuartzCore 0x000000018ba9faf0 CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 116
11 CoreFoundation 0x00000001887a57dc __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 28
12 CoreFoundation 0x00000001887a340c __CFRunLoopDoObservers + 368
13 CoreFoundation 0x00000001886d2068 CFRunLoopRunSpecific + 472
14 WebCore 0x000000018d273a2c RunWebThread(void*) + 452
15 libsystem_pthread.dylib 0x000000018788b860 _pthread_body + 236
16 libsystem_pthread.dylib 0x000000018788b770 _pthread_start + 280
17 libsystem_pthread.dylib 0x0000000187888dbc thread_start + 0
任何想法是怎么回事? 看起来像下面的崩溃组也是相关的。
崩溃组1
[UIWebBrowserView _collectAdditionalSubviews]
objc_msgSend() selector name: autorelease
崩溃组2
[UIWebDocumentView subviews]
objc_msgSend() selector name: arrayByAddingObjectsFromArray:
答
我回答我自己的问题,因为我能复制这个问题,并找到了根源。
请注意以下几点。
1.我正在使用一个UIWebView。首先,这不被推荐。
2.以下执行方式导致此问题。我在这里编写伪代码来演示问题。
@implementation MyViewController
- (void)loadView {
//creating UIWebView Here
self.webView = [[UIWebView alloc] initWithFrame:_some_frame];
//setting the web view properties here.
//Adding to the view
[self.view addSubView: self.webView];
[self populateWebView];
}
- (void) populateWebView {
[self.webView loadHTMLString:_some_html
baseURL:[NSURL fileURLWithPath:_some_path]];
}
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
if (self.webView) {
//The following two lines causing this issue.
self.webView.scrollView.contentInset = _some_insets;
self.webView.scrollView.scrollIndicatorInsets = _some_insets;
}
}
@end
3.将溶液在下面给出。
@implementation MyViewController
- (void)loadView {
//creating UIWebView Here
self.webView = [[UIWebView alloc] initWithFrame:_some_frame];
//setting the web view properties here.
//Adding to the view
[self.view addSubView: self.webView];
[self populateWebView];
}
- (void) populateWebView {
[self.webView loadHTMLString:_some_html
baseURL:[NSURL fileURLWithPath:_some_path]];
}
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
}
- (void)webViewDidFinishLoad:(UIWebView *)webView {
webView.scrollView.contentInset = _some_insets;
webView.scrollView.scrollIndicatorInsets = _some_insets;
}
@end
在我实际的代码,我在这里使用自定义的WebView类通过继承UIWebView的。不认为这会造成一些问题。根本原因是设置“contentInset”和“scrollIndicatorInsets”in viewDidLayoutSubviews这不是一个好主意。当我把折点,“viewDidLayoutSubviews”多次调用并最终导致App崩溃。
作为解决方案,我将以下代码部分移至“webViewDidFinishLoad”,只有在加载完成后WebView已准备好时才会调用该代码。因此,在此委托方法下添加此代码是有意义的。
webView.scrollView.contentInset = _some_insets;
webView.scrollView.scrollIndicatorInsets = _some_insets;
+0
在了解根本原因之前,我不知道我的代码的哪一部分导致了问题,并且在崩溃报告中也没有可用的信息。 –
我也是,我们的应用程序在iOS 10更新后遇到类似的崩溃。 – RainCast
您是否尝试更改应用中具有自动布局约束的对象的框架? – Prav
从崩溃日志中,这个对象可以是一个WebView,对吧?这是肯定的 ? –