2011-12-15 127 views
15

我有一個用來顯示幾個小PDF的UIWebView。用戶從表格中選擇一篇新聞文章,然後將文章(PDF)加載到同一屏幕上的UIWebView中。第一次加載總是很好。然後,我選擇的下一個項目(不管是哪一個)會崩潰應用程序。UIWebView在第二次pdf加載請求時崩潰

這是我如何加載每篇文章:在線路的loadRequest發生後

NSString *filePath = [[NSBundle mainBundle] pathForResource:articleFileName ofType:@"pdf"]; 
[articleView stopLoading]; 
[articleView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:filePath]]]; 

崩潰。
該崩潰不會提供錯誤信息。除:

所有異常{} 0x3629f000

,捕獲點3(拋出異常)(GDB)

它只是崩潰主()。我在調試器中驗證過它在每個請求上使用了正確的文件路徑。

我有NSZombies運行,我有斷點設置爲所有例外。

+0

Web查看委託是否更改? – amattn 2011-12-15 19:01:32

+0

代表是自己的(通過IB連接)從不改變。 – Dancreek 2011-12-15 19:04:17

回答

34

我也有這個確切的問題。非常感謝史蒂夫幫助我進一步縮小範圍,我的例外情況與他的例外情況相同。

你有沒有打破所有的例外設置?我發現,如果我禁用該斷點,它不會再崩潰。這讓我想到這只是新調試器或iOS版本中的一些錯誤?另一件事讓我想到,當我在iOS 4.3.x或4.3模擬器的設備上運行時,這種崩潰不會發生。

9

我看到類似的東西 - 兩者同時在加載PDF後加載PDF或在加載PDF後加載HTML時釋放webview。它似乎是rdar:// 10431759(請參閱http://openradar.appspot.com/10431759)。我沒有辦法解決它。我可以通過加載pdf然後加載html字符串@"<div></div>"來重現它,所以它看起來不是委託問題。

如果你輸入「BT」到gdb的控制檯,你可能會得到真正的堆棧跟蹤,包括:

#0 0x37ccd1c8 in objc_exception_throw() 
#1 0x381817b8 in +[NSException raise:format:arguments:]() 
#2 0x381817b8 in +[NSException raise:format:arguments:]() 
#3 0x381817da in +[NSException raise:format:]() 
#4 0x35462628 in -[NSObject(NSKeyValueObserverRegistration) _removeObserver:forProperty:]() 
#5 0x35462296 in -[NSObject(NSKeyValueObserverRegistration) removeObserver:forKeyPath:]() 
#6 0x31fc3448 in -[UIWebPDFView _removeBackgroundImageObserverIfNeeded:]() 
#7 0x31fc36a8 in -[UIWebPDFView dealloc]() 
#8 0x37cc90c4 in _objc_rootRelease() 
#9 0x31dd2614 in -[UIWebPDFViewHandler clearAllViews]() 
#10 0x31d76708 in -[UIWebPDFViewHandler _replacePDFViewIfPresentWithWebDocView:]() 
#11 0x31d766a6 in -[UIWebPDFViewHandler _removePDFViewIfWebDocViewIsNotPDF:]() 
#12 0x31d76644 in -[UIWebBrowserView webView:didFirstVisuallyNonEmptyLayoutInFrame:]() 

當設備上進行調試,你可以輸入「0幀」和「寶$ R0」看到異常消息:(我認爲這是「寶$ EAX」的模擬器。)

(gdb) frame 0 
#0 0x37ccd1c8 in objc_exception_throw() 
(gdb) po $r0 
Cannot remove an observer <UIWebPDFView 0x4a3200> for the key path "backgroundImage" from <UIPDFPageView 0x4a4bf0> because it is not registered as an observer. 

編輯:這個問題似乎只當我有「打破扔」出現開啓Objective- C例外。

0

我有一個類似的問題,我的UIWebView掛(只是在一個灰色的屏幕上凍結,旋轉的「加載」圈永遠不會結束)。如果我退出程序,它會在我第二次加載時崩潰。

最後,我做了足夠的跟蹤,並且發現如果我先從應用程序資源包中加載標籤字體(使用Cocos2d的),然後嘗試加載PDF,然後它將工作,不會崩潰。

這是一個非常醜陋的黑客,但其他人可能會覺得它有用。

// HACK: Loading a TTF font first is needed to properly load PDF/HTML 
CCLabelTTF* label = [CCLabelTTF labelWithString:@"Testing" fontName:@"DIN-Black" fontSize:12]; 
[label setVisible:false]; 

// We never actually use the label -- we just create it so that it loads the font 
NSString *path = [[NSBundle mainBundle] 
        pathForResource:myPDF 
        ofType:@"pdf"]; 

CCLOG(@"Retrieving PDF from '%@'", path); 

NSURL *pdfUrl = [NSURL fileURLWithPath:path]; 
NSURLRequest *request = [NSURLRequest requestWithURL:pdfUrl]; 

[webView loadRequest:request]; 
[webView setScalesPageToFit:YES]; 
[super onEnter];