弹出 NavigationController 时应用程序崩溃!
Posted
技术标签:
【中文标题】弹出 NavigationController 时应用程序崩溃!【英文标题】:App Crashes when NavigationController is popped! 【发布时间】:2009-10-02 10:08:50 【问题描述】:以下是我从客户端发送的崩溃日志中复制/粘贴的内容。我无法理解这是什么意思:s
显然,当导航回上一个屏幕时,应用程序似乎崩溃了(这就是客户报告的情况)。这里的 UIWebDocumentView 是什么?
我需要解决崩溃问题,但我被困在这里,非常感谢任何帮助。
附:我正在使用 iphone sdk 3.0。
Date/Time: 2009-09-29 18:16:28.458 -0400
OS Version: iPhone OS 3.0 (7A341)
Report Version: 104
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0xbbadbeef
Crashed Thread: 4
Thread 4 Crashed:
0 WebCore 0x3588dd74 __ZL17_WebTryThreadLockb + 288
1 WebCore 0x3588e4c0 __ZL18_WebThreadAutoLockv + 52
2 UIKit 0x30aea484 -[UIWebDocumentView _responderForBecomeFirstResponder] + 8
3 UIKit 0x30978b34 -[UINavigationTransitionView transition:fromView:toView:] + 200
4 UIKit 0x30978a54 -[UINavigationTransitionView transition:toView:] + 24
5 UIKit 0x30974470 -[UINavigationController _startTransition:fromViewController:toViewController:] + 1604
6 UIKit 0x30973d90 -[UINavigationController _startDeferredTransitionIfNeeded] + 256
7 UIKit 0x309a7468 -[UINavigationController _popViewControllerWithTransition:allowPoppingLast:] + 400
8 UIKit 0x309a72c8 -[UINavigationController popViewControllerAnimated:] + 32
9 Snocell 0x0002ae00 0x1000 + 171520
10 Foundation 0x30554062 -[NSThread main] + 42
11 Foundation 0x305023f2 __NSThread__main__ + 852
12 libSystem.B.dylib 0x31d705a0 _pthread_body + 20
【问题讨论】:
好的,我想我找到了解决方案。共享它以防有人掉到这里:EXC_BAD_ACCESS (SIGSEGV) KERN_INVALID_ADDRESS 表示您引用的虚拟地址不在页表中,或者您无权访问。这是一个不允许您访问的虚拟地址。对于您的示例地址地址 0x67696c69 ,这很可能不是被视为指针的指针;或者包含指针的数据结构被释放并被其他数据覆盖。然后,我在日志中看到了 WebCore,它是 iPhone WebKit 中的一个组件 (bit.ly/4j4WsN) 所以,我在这里做什么,在 UIWebView 中显示一个网站,在它可以完全加载之前,弹回到以前的视图控制器,它就崩溃了。我发现 UIWebView 需要在释放它之前清除它的委托;否则,如果 Web 请求在您释放 UIWebView 后完成,它会尝试回调委托并导致应用程序崩溃。解决方案:我添加了“myWebView.delegate = nil;”在弹出视图控制器之前,它现在正在工作:) 我遇到了类似的问题——webView.delegate = nil 解决了它,就像你一样。 我来这里是为了寻找 BADBEEF。 【参考方案1】:好的,我想我找到了解决方案。分享它以防其他人遇到同样的情况:
EXC_BAD_ACCESS (SIGSEGV) KERN_INVALID_ADDRESS
表示您引用的虚拟地址不在页表中,或者您无权访问。这是一个不允许您访问的虚拟地址。对于您的示例地址地址 0x67696c69 ,这很可能不是被视为指针的指针;或者包含指针的数据结构被释放并被其他数据覆盖。
然后,我在日志的堆栈跟踪中看到了 WebCore(WebCore 是 iPhone WebKit 中的一个组件 - http://en.wikipedia.org/wiki/WebKit#Components)
所以,我在这里做的是,在 UIWebView 中显示一个网站,在它可以完全加载之前,弹回到以前的视图控制器,它崩溃。
我发现 UIWebView 需要在释放它之前清除它的委托;否则,如果 Web 请求在您释放 UIWebView 后完成,它会尝试回调委托并导致应用程序崩溃。
解决方案:我在弹出视图控制器之前添加了以下代码,它现在可以工作了:)
if (webView.loading)
[webView stopLoading];
webView.delegate = nil;
【讨论】:
这个修复对我不起作用(尽管我在旧 iPhone 2G 上进行测试)。我只是删除了 popViewController 调用。不是最聪明的解决方案,但它确实有效,而且在某些方面它更合乎逻辑。 事实证明,删除 popViewController 语句也解决了其他问题。我认为在 didFailLoadWithError 方法中最好不要调用 popViewController。 谢谢,帮助我找到了正确的研究方向 有谁知道这是否是 WKWebView 的问题?我们几年前就实施了这个解决方案,但现在正在迁移到 WKWebView,并想知道我们是否应该继续进行这个清理工作。【参考方案2】:我认为以下将是正确的方法。首先将委托设置为零。
webView.delegate = nil;
if (webView.loading)
[webView stopLoading];
【讨论】:
以上是关于弹出 NavigationController 时应用程序崩溃!的主要内容,如果未能解决你的问题,请参考以下文章
TabBarController + NavigationController:推送和弹出问题
如何从导航堆栈中推送/弹出uiviewcontroller时收到警报
弹出到 NavigationController 堆栈中的特定 ViewController
如果从navigationController弹出时会释放ViewController?
关闭(或弹出)我手动添加的 NavigationController 不起作用
Swift iOS - 如何使用 NavigationController 弹出到不同的 SegmentControl 索引