UIWebview: WebThread EXC_BAD_ACCESS

7

我有一个非常简单的应用程序:显示一个带有http://tv2.dk的网页视图

我使用了一个故事板,添加了网页视图,并在我的控制器上设置了一个属性。为了保持简单,我没有设置委托。

在viewDidLoad中,我使用想要加载的url调用了网页视图。

[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://tv2.dk"]]];

每次应用程序启动时,由于Web线程工作者中的某些错误,它都会崩溃,参见此转储。
libobjc.A.dylib`objc_msgSend:
0x1954f7bc0:  cmp    x0, #0
0x1954f7bc4:  b.le   0x1954f7c30               ; objc_msgSend + 112
0x1954f7bc8:  ldr    x13, [x0]
0x1954f7bcc:  and    x9, x13, #0x1fffffff8
0x1954f7bd0:  ldp    x10, x11, [x9, #16]
0x1954f7bd4:  and    w12, w1, w11
0x1954f7bd8:  add    x12, x10, x12, lsl #4
0x1954f7bdc:  ldp    x16, x17, [x12]
0x1954f7be0:  cmp    x16, x1
0x1954f7be4:  b.ne   0x1954f7bec               ; objc_msgSend + 44
0x1954f7be8:  br     x17
0x1954f7bec:  cbz    x16, 0x1954f7d80          ; _objc_msgSend_uncached_impcache
0x1954f7bf0:  cmp    x12, x10
0x1954f7bf4:  b.eq   0x1954f7c00               ; objc_msgSend + 64
0x1954f7bf8:  ldp    x16, x17, [x12, #-16]!
0x1954f7bfc:  b      0x1954f7be0               ; objc_msgSend + 32
0x1954f7c00:  add    x12, x12, w11, uxtw #4
0x1954f7c04:  ldp    x16, x17, [x12]
0x1954f7c08:  cmp    x16, x1
0x1954f7c0c:  b.ne   0x1954f7c14               ; objc_msgSend + 84
0x1954f7c10:  br     x17
0x1954f7c14:  cbz    x16, 0x1954f7d80          ; _objc_msgSend_uncached_impcache
0x1954f7c18:  cmp    x12, x10
0x1954f7c1c:  b.eq   0x1954f7c28               ; objc_msgSend + 104
0x1954f7c20:  ldp    x16, x17, [x12, #-16]!
0x1954f7c24:  b      0x1954f7c08               ; objc_msgSend + 72
0x1954f7c28:  mov    x2, x9
0x1954f7c2c:  b      0x1954e1e70               ; objc_msgSend_corrupt_cache_error
0x1954f7c30:  b.eq   0x1954f7c48               ; objc_msgSend + 136
0x1954f7c34:  adrp   x10, 18278
0x1954f7c38:  add    x10, x10, #1904
0x1954f7c3c:  lsr    x11, x0, #60
0x1954f7c40:  ldr    x9, [x10, x11, lsl #3]
0x1954f7c44:  b      0x1954f7bd0               ; objc_msgSend + 16
0x1954f7c48:  movz   x1, #0
0x1954f7c4c:  movi   d0, #0000000000000000
0x1954f7c50:  movi   d1, #0000000000000000
0x1954f7c54:  movi   d2, #0000000000000000
0x1954f7c58:  movi   d3, #0000000000000000
0x1954f7c5c:  ret    

错误行

0x1954f7bd0:  ldp    x10, x11, [x9, #16]

请查看完整源代码: https://bitbucket.org/styrken/ios-webview-crash 我已尝试在多个设备上运行此代码,但它在所有设备上都崩溃了。

尝试在viewWillAppear中调用loadRequest:,也许会有帮助。 - ZGl6YXNt
1
将代码放在viewWillAppear或viewDidAppear中都没有效果,结果相同。 - Rasmus Styrk
1
我发现使用NSZombie时,出现了以下崩溃信息:WebviewCrash [4598: 956679] *** -[UIViewAnimationState release]: message sent to deallocated instance 0x1707c5370。为了解决这个问题,我必须在UIVIew中关闭动画,使用[UIView setAnimationsEnabled:NO];现在它可以正常工作了。看起来像是iOS8的一个错误。 - Rasmus Styrk
1
当@RasmusStyrk,太神奇了。你是怎么发现的?我们一直都想不出问题所在!我会把这个复制到答案里,这样更明显。 - Duke
3个回答

9

从@RasmusStyrk的评论中得知:

我发现使用NSZombie后,出现以下崩溃信息:WebviewCrash [4598:956679] *** - [UIViewAnimationState release]:消息发送到已释放的实例0x1707c5370。为了解决这个问题,我必须关闭UIVIew中的动画,使用[UIView setAnimationsEnabled:NO]; 现在它可以工作了。看起来像是iOS8中的一个错误。

我们也遇到过这种情况,而设置[UIView setAnimationsEnabled:NO]是唯一完全消除此问题的方法!


是的,我非常确定这是一个bug。无论如何 - 您可以关闭动画或使用新的WKWebview类。 - Rasmus Styrk

3

Thread EXC_BAD_ACCESS这句话已经说明了一切。 UIWebView喜欢从主线程中调用。尝试按照以下方式编写代码:

dispatch_async(dispatch_get_main_queue(), ^{
 //send webview a message 
 [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://tv2.dk"]]];
});

0
在我的情况下,我犯了一个愚蠢的错误,忘记在加载资源之前将WKWebView添加到视图层次结构中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接