2009-10-05 72 views
23

我刚刚从iTunes Connect下载了我的一个iPhone应用程序的崩溃报告。最常见的碰撞有类似下面的跟踪:UIWebView中的EXC_BAD_ACCESS

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Codes: KERN_INVALID_ADDRESS at 0xa1b1c1db 
Crashed Thread: 0 

Thread 0 Crashed: 
0 libobjc.A.dylib     0x3030e6f4 objc_msgSend + 16 
1 UIKit       0x30ebebee -[UIWebView webView:resource:didFinishLoadingFromDataSource:] 
2 UIKit       0x30ebe5ca -[UIWebViewWebViewDelegate webView:resource:didFinishLoadingFromDataSource:] 
3 CoreFoundation     0x32b73b5c __invoking___ + 60 
4 CoreFoundation     0x32bc67be -[NSInvocation invoke] 
5 WebCore       0x320baa86 HandleDelegateSource 
6 CoreFoundation     0x32bb8a96 CFRunLoopRunSpecific 
7 CoreFoundation     0x32bb8356 CFRunLoopRunInMode 
8 GraphicsServices    0x30544cd4 GSEventRunModal 
9 GraphicsServices    0x30544d80 GSEventRun 
10 UIKit       0x30d2c768 -[UIApplication _run] 
11 UIKit       0x30d2b46c UIApplicationMain 

我80%肯定这是内部的UIWebView外的什么,我可以解决范围的问题。有没有人有任何关于如何缩小这个问题的建议,以帮助确定是否是操作系统和UIWebView的问题,或者我可以在我的代码中解决和解决的问题?提前致谢。

更新:有问题的UIWebView是在用户点击相应导航控制器的后退按钮时被释放的视图。接受的解决方案似乎为发生此错误提供了一个很好的解释。

建议的解决方案之前:

- (void)dealloc { 
    [webView release]; 

    [super dealloc]; 
} 

建议的解决方案后:

- (void)dealloc { 
    webView.delegate = nil; 
    [webView stopLoading]; 
    [webView release]; 

    [super dealloc]; 
} 

回答

53

的情况是这样的:

  1. 用户输入屏幕UIWebView。该UIViewControllerself作为委托
  2. 网页开始下载
  3. 用户退出屏幕 3A。 UIViewController被释放
  4. UIWebView完成加载,并发送“我完了”的消息给其委托...

你需要从它的加载页面停止UIWebView,并将其委托给无取消分配委托之前。

+2

我会把钱放在一个释放的代表是这个原因。 – 2009-10-05 21:10:54

+0

veyr有用,谢谢。 – 2010-06-14 08:11:42

+0

这正是我发生的事情,出色的分析。 – 2015-08-18 17:00:57

1

这几乎是100%在你的代码中的错误。 iPhone SDK中的错误是非常罕见的,并且UIWebView已经被很多其他开发者测试过。

EXC_BAD_ACCESS通常在您尝试访问已释放的对象时发生。显然,如果苹果的代码试图这样做,那么你是错误地发布了对象的人。你确定你没有-autorelease-release太多?

+2

让我想起主持人的报价“60%的时间它每次工作” – slf 2009-10-05 15:17:13

0

在您的代码中执行UIWebViewDelegate协议时,请更加努力地观察内容。特别是你想看看什么正在处理webViewDidFinishLoad:你正试图访问一个已经发布的变量。如果可以,请发布完整的源代码,这将帮助我们为您找到它。

0

我有类似的问题。我用的是:

[webView loadHTMLString:str baseURL:tmpUrl]; 

[str release]; 

“STR”的发布引起我最近在我的应用程序,随机崩溃类似的问题错误消息“EXC_BAD_ACCESS”

1

。原来问题是在加载的HTML中使用“onclick=”。

用简单的<a href="javascript:some_script">替换了onclick,问题就消失了。

希望这可以帮助其他人遇到与webviews相同的问题。