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

Dan*_*eek 16 pdf iphone uiwebview ipad

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

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

NSString *filePath = [[NSBundle mainBundle] pathForResource:articleFileName ofType:@"pdf"];
[articleView stopLoading];
[articleView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:filePath]]];
Run Code Online (Sandbox Code Playgroud)

崩溃发生在loadRequest行之后.
崩溃没有提供错误信息.以外:

所有异常{} 0x3629f000

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

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

我有NSZombies正在运行,我为所有异常设置了断点.

Bek*_*Bek 36

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

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

  • 禁用"Break on all Exceptions"断点解决了我的问题,这是在堆栈跟踪中的UIWebPDFView _removeBackgroundImageObserverIfNeeded之后发生的.谁会认为断点会导致崩溃? (5认同)
  • 我发现你可以在遇到断点后继续调试器.可能有一个例外是在Apple的代码中被捕获和处理,因此即使通过异常触发断点,它也不会导致崩溃. (4认同)
  • 好的,那么有没有办法让All Exceptions断点处于活动状态(这对于找到发生真正崩溃的位置很有用),而不是每次都绊倒PDF释放?我的应用程序做了很多,所以它真的放慢了我的工作. (2认同)

Ste*_*eve 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:] ()
Run Code Online (Sandbox Code Playgroud)

在设备上进行调试时,可以输入"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.
Run Code Online (Sandbox Code Playgroud)

编辑:当我为Objective-C异常打开"Break on throw"时,似乎只会发生此问题.