【问题标题】:OSX 10.10.3 crashes WebView on deallocOSX 10.10.3 在 dealloc 上崩溃 WebView
【发布时间】:2015-04-20 11:03:38
【问题描述】:

更新到 10.10.3 后,WebView 组件在dealloc之后开始崩溃

- (void)dealloc {
    [self.webView.windowScriptObject setValue:nil forKey:@"CocoaApp"];
    [[self.webView mainFrame] stopLoading];
    [self.webView setUIDelegate:nil];
    [self.webView setEditingDelegate:nil];
    [self.webView setFrameLoadDelegate:nil];
    [self.webView setPolicyDelegate:nil];
    [self.webView removeFromSuperview];
}

崩溃发生在 WebView 的深处

EXC_BAD_ACCESS

1   0x7fff910bae9e WebDocumentLoaderMac::detachFromFrame()
2   0x7fff920288c0 WebCore::FrameLoader::detachFromParent()
3   0x7fff910d0e55 -[WebView(WebPrivate) _close]
4   0x7fff910d0c49 -[WebView dealloc]
5   0x7fff8b1cf89c objc_object::sidetable_release(bool)
6   0x7fff8b1b5e8f (anonymous namespace)::AutoreleasePoolPage::pop(void*)
7   0x7fff912b26f2 _CFAutoreleasePoolPop
8   0x7fff8830e762 -[NSAutoreleasePool drain]
9   0x7fff8e3f0cc1 -[NSApplication run]
10  0x7fff8e36d354 NSApplicationMain
11  0x1000ebb12 main
12  0x7fff8c81e5c9 start
13  0x3

有什么想法吗?这是苹果的错误吗?它在 10.10.3 之后开始?

启用 NSZombie 时不会崩溃!

【问题讨论】:

  • 通常如果你启用 NSZombie,它应该告诉你哪个对象在被释放后会收到消息。你能检查一下那是哪个物体吗?
  • 不,因为启用 NSZombie 时不会发生崩溃或任何其他问题 :( 它发生在 webview 组件的深处
  • 您是否设置了任何其他代表而不是取消他们? developer.apple.com/library/mac/documentation/Cocoa/Reference/… 几周前我遇到了这个问题,结果我忘了取消其中一位代表
  • 不,所有代表都被淘汰了...问题始于 10.10.3
  • 在使用 JS 桥接器时,我在 swift 应用程序上遇到了类似的问题。打开与 Apple 的错误报告导致Duplicate of 13811738 (Open) 编辑:问题接缝随机发生

标签: objective-c macos cocoa webview


【解决方案1】:

我注意到您正在使用自己的策略委托:

[self.webView setPolicyDelegate:nil];

有一个与 WebKit 中的策略委托相关的已知错误(最近才修复):

https://bugs.webkit.org/show_bug.cgi?id=144975

简短的版本是您可能遇到了这个断言(这会导致进程因故意的段错误而崩溃):

https://github.com/WebKit/webkit/blob/24b1ae89efc10a4e6a6057b429c8e1d8d138a32f/Source/WebCore/loader/DocumentLoader.cpp#L935

因为您的策略处理程序(即decidePolicyForMIMEType:request:frame:decisionListener:)未能做出策略决定(即不是useignoredownload)。决策悬而未决,当加载器最终分离时,它断言没有未决的策略决策,由于视图仍在等待决策而失败。

【讨论】:

    【解决方案2】:

    我所做的修复不是发布 webview,而是对其进行静态引用(这远未解决,我就这个问题联系了 Apple)

    #warning HOTFIX
    {
        //this is because of http://stackoverflow.com/questions/29746074/osx-10-10-3-crashes-webview-on-dealloc
        static NSMutableArray * LIVE_FOR_EVER_WEBVIEW;
    
        if (LIVE_FOR_EVER_WEBVIEW == nil) {
            LIVE_FOR_EVER_WEBVIEW = [NSMutableArray new];
        }
        if (self.webView) {
            [LIVE_FOR_EVER_WEBVIEW addObject:self.webView];
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-15
      • 1970-01-01
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多