代码之家  ›  专栏  ›  技术社区  ›  Aaron

在uiwebview中排除错误访问

  •  27
  • Aaron  · 技术社区  · 15 年前

    我刚从iTunes Connect下载了一个iPhone应用程序的崩溃报告。最常见的崩溃痕迹如下:

    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];
    }
    
    5 回复  |  直到 8 年前
        1
  •  59
  •   Stephen Darlington    15 年前

    情况是这样的:

    1. 用户进入屏幕时 UIWebView . 这个 UIViewController self 作为代表
    2. 网页开始下载
    3. 用户退出屏幕 3A。 ui视图控制器 得到解除分配
    4. UIWebVIEW 完成加载并将“我完成”消息发送给其代理…

    你需要停止 UIWebVIEW 在取消分配委托之前,加载其页面并将其委托设置为nil。

        2
  •  3
  •   Georg Schölly Crazy Developer    15 年前

    这几乎是100%的代码错误。iPhone SDK中的错误非常罕见,而且 UIWebView 已经被许多其他开发人员测试得相当好了。

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

        3
  •  1
  •   J. Chomel    8 年前

    我最近遇到了一个类似的问题,我的应用程序随机崩溃。结果发现问题出在使用中“ onclick= “在加载的HTML中。

    取代了 onclick 用简单 <a href="javascript:some_script"> 问题就消失了。

    希望这能帮助其他遇到同样问题的人 webviews .

        4
  •  0
  •   slf    15 年前

    仔细看看代码中实现 UIWebViewDelegate 协议。特别是你想看看什么是处理 webViewDidFinishLoad: 您试图访问已释放的变量。如果可以的话,发布完整的源代码,这将帮助我们为您找到它。

        5
  •  0
  •   sra Jon    13 年前

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

     [webView loadHTMLString:str baseURL:tmpUrl];
    
     [str release];
    

    “str”的释放导致错误消息“exc_bad_access”