UIWebView在第二个pdf加载请求时崩溃

时间:2011-12-15 18:05:34

标签: iphone ipad pdf uiwebview

我有一个UIWebView,我用它来显示几个小PDF。用户从表中选择新闻文章,然后在同一屏幕上的UIWebView中加载文章(PDF)。第一次加载总是很好。然后我选择的下一个项目(无论哪一个)崩溃应用程序。

这就是我加载每篇文章的方式:

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

崩溃发生在loadRequest行之后 崩溃没有提供错误信息。除了:

所有异常{} 0x3629f000

Catchpoint 3(抛出异常)。(gdb)

它只是崩溃到main()。我已在调试器中验证它在每个请求上使用了正确的文件路径。

我运行了NSZombies,并为所有异常设置了断点。

3 个答案:

答案 0 :(得分:35)

我也有这个问题。非常感谢史蒂夫帮助我进一步缩小范围,我的例外与他的相同。

您是否在所有例外情况下都有中断?我发现如果我禁用该断点,它不再崩溃。让我觉得这只是新调试器或iOS版本中的一些错误?让我想到的另一件事是,当我在iOS 4.3.x或4.3模拟器的设备上运行时,不会发生这种崩溃。

答案 1 :(得分:9)

我看到类似的东西 - 在加载PDF后释放webview或在加载PDF后加载html时都是如此。它似乎是rdar:// 10431759(见http://openradar.appspot.com/10431759)。我没有办法解决它。我可以通过加载pdf然后加载html字符串@"<div></div>"来重现它,因此它似乎不是委托问题。

如果在gdb控制台中输入“bt”,您可能会得到真正的堆栈跟踪,包括:

#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:] ()

在设备上调试时,可以输入“frame 0”和“po $ r0”来查看异常消息:(我认为它是模拟器中的“po $ 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例外打开“Break on throw”时,似乎只会出现此问题。

答案 2 :(得分:0)

我有一个类似的问题,我的UIWebView悬挂着(只是在灰色屏幕上冻结,旋转的“加载”圈子从未结束)。如果我退出程序,它会在第二次加载时崩溃。

最后我做了足够的跟踪并且四处乱窜我发现如果我首先从app资源包中加载标签字体(CCLabelTTF使用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];