我在我的应用程序崩溃跟踪工具中发现了一些崩溃。基本上我有一个 tabBarController,其中一个选项卡有一个嵌入式 UIWebView,另一个选项卡有一个带有 UITableView 的 Controller 。所以发生的情况是,当用户首先转到 WebView 并开始加载时,几秒钟后他们转到 tableView Controller ,崩溃随机发生。
从我在崩溃日志中看到的时间来看,当用户点击 UITableView 选项卡时,webView 似乎即将完成加载,因此我在 didFinishLoading 中插入了一段代码。这样我就可以可靠地重现崩溃。代码如下所示:
webViewController:
- (void)webViewDidFinishLoad:(UIWebView *)webView {
[tabBarController gotoTableViewController];
}
tableViewController:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.tableView reloadData];
}
这是崩溃:
bool _WebTryThreadLock(bool), 0x1700113d0: Multiple locks on web thread not allowed! Please file a bug. Crashing now...
我不知道该怎么办,似乎 webView 和 tableView 都锁定了 mainThread?有没有办法“卸载”从主线程加载的 webView ?我尝试过停止加载,但不起作用...
找到了。确实是在mainThread上解析文件造成的。我的文件解析是利用 NSRunLoop 来解析 XML 文件。然而,该文件旨在用作缓存值并需要同步解析,因此我将其放在 mainThread 上。我试图将它放到后台线程上并使用 dispatch_sync
,崩溃仍然存在。所以我用 dispatch_semaphore_t
尝试了 dispatch_async
,崩溃消失了!
Tôi là một lập trình viên xuất sắc, rất giỏi!