2015-04-20 72 views
3

更新到10.10.3後的WebView組件開始崩潰崩潰發生在WebView中OSX 10.10.3崩潰的WebView上的dealloc

深的地方後 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]; 
} 

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 

有什麼想法?這是Apple的錯誤嗎?它從10.10.3開始?

當NSZombie啓用時它不會崩潰!

+0

通常情況下,如果你啓用NSZombie,它應該告訴你哪個對象在被釋放後接收到一條消息。你能檢查哪個對象嗎? – Ayu

+0

沒有,因爲崩潰,或任何其他問題不會發生時,NSZombie啓用:(並且它發生在webview組件內部深處 –

+0

你是否設置任何其他代表,而不是將它們填充?https://developer.apple。 com/library/mac/documentation/Cocoa/Reference/WebKit/Classes/WebView_Class/index.html#// apple_ref/doc/uid/20001903-SW21 我在幾周前遇到了這個問題,結果我忘記了去掉其中一個代表 –

回答

1

我注意到你使用自己的政策代表:

[self.webView setPolicyDelegate:nil]; 

有一個在WebKit的相關政策代表(直到最近才固定)一個已知的bug:

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:)未能作出政策決定(即不是use,ignoredownload)。這個決定懸而未決,當加載器最終分離時,它斷言沒有未決的策略決策,由於該視圖仍在等待決定,因此該決策失敗。

+0

這樣做!!!!!謝謝 –

0

我做了修復,不釋放web視圖,但持有的靜態引用到它(這是遠遠沒有解決它,我接觸蘋果就這個問題)

#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]; 
    } 
}