弹出NavigationController时App崩溃了!

时间:2009-10-02 10:08:51

标签: objective-c iphone iphone-sdk-3.0 uinavigationcontroller crash-reports

以下是我从客户端发送的崩溃日志中复制/粘贴的内容。我无法理解这是什么意思:s

显然,当导航回到之前的屏幕时,应用程序看起来崩溃了(这就是客户报告的内容)。什么是UIWebDocumentView?

我需要解决这次崩溃,但我被困在这里所以任何帮助都非常感谢。

P.S。我正在使用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

2 个答案:

答案 0 :(得分:15)

好的,我想我找到了解决方案。分享它以防其他人陷入相同的情况:

EXC_BAD_ACCESS (SIGSEGV) KERN_INVALID_ADDRESS表示您正在参考的虚拟地址不在页面表中,或者您没有访问权限。这是一个您不允许访问的虚拟地址。对于您的示例地址地址0x67696c69,可能这不是指针被视为指针;或者包含指针的数据结构是免费的,并用其他数据覆盖。

然后,我在日志中的堆栈跟踪中看到WebCore(WebCore是iPhone WebKit中的一个组件 - http://en.wikipedia.org/wiki/WebKit#Components

所以,我在这里做了什么,在UIWebView中显示了一个网站,在它完全加载之前,弹回到以前的视图控制器并且 CRASHED

我发现UIWebView需要在发布之前清除其委托;否则,如果在释放UIWebView后Web请求完成,它将尝试回调该委托并导致应用程序崩溃。

解决方案:我在弹出视图控制器之前添加了以下代码,现在它正在运行:)

if (webView.loading)
    [webView stopLoading];
webView.delegate = nil;

答案 1 :(得分:0)

我认为以下是正确的方法。首先将委托设置为nil。

webView.delegate = nil;
if (webView.loading)
    [webView stopLoading];