Сбой UIWebView при втором запросе загрузки PDF - PullRequest
15 голосов
/ 15 декабря 2011

У меня есть UIWebView, который я использую, чтобы показать несколько небольших PDF-файлов.Пользователь выбирает новостную статью из таблицы, а затем статья (PDF) загружается в UIWebView на том же экране.Первая загрузка всегда идет просто отлично.Затем следующий элемент, который я выбираю (независимо от того, какой именно), вылетает из приложения.

Вот как я загружаю каждую статью:

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 ]

35 голосов
/ 18 декабря 2011

У меня точно такая же проблема.Большое спасибо Стиву за то, что он помог мне сузить его еще больше, мое исключение такое же, как у него.

Есть ли у вас разрыв на все исключения?Я обнаружил, что если я отключаю эту точку останова, она больше не падает.Что заставило меня подумать, что это просто какая-то ошибка в новой версии отладчика или iOS?Еще одна вещь, которая заставила меня задуматься, это то, что этот сбой не происходит, когда я работаю на устройстве с iOS 4.3.x или симулятором 4.3.

9 голосов
/ 17 декабря 2011

Я вижу что-то похожее - как при освобождении веб-просмотра после загрузки PDF, так и при загрузке html после загрузки PDF.Кажется, это 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:] ()

При отладке на устройстве вы можете ввести «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.

Редактировать: Эта проблема возникает только тогда, когда у меня включен "Break on throw" для исключений Objective C.

0 голосов
/ 08 августа 2012

У меня была похожая проблема с моим UIWebView зависанием (просто зависание на сером экране с вращающимся кругом «загрузки», который никогда не заканчивался). Если я выйду из программы, то при следующей загрузке произойдет сбой.

Наконец-то я достаточно проследил в нем и развернулся, и обнаружил, что если я сначала загрузил шрифт метки (с 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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...