我有一个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,并为所有异常设置了断点。
答案 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];