У меня есть iPad-приложение, которое в App Store уже около трех месяцев, и я получаю некоторые странные отчеты о сбоях, которые я не могу понять. Это не так часто, с момента запуска запускалось около 15-20 экземпляров, но до сих пор достаточно частым, чтобы на самом деле обмануть меня. Сбои немного отличаются (см. Следы стека ниже), но поскольку они связаны с WebCore
, я предполагаю, что они связаны с использованием UIWebView
в приложении и могут иметь общую причину, хотя я не на 100% положительный. Цель развертывания приложения - iOS 6.0, но сбои появляются на iPad 2, iPad 3 и iPad Mini, исключительно на iOS 7.
В приложении есть только одно место, где я использую webview, для отображения веб-страниц новостей из разных источников. У меня есть один контроллер представления для этого, который имеет UIWebView
как его вид. Существует один экземпляр этого контроллера представления, который живет во всем приложении, каждый раз, когда выбирается новая статья, существующий веб-просмотр перезагружается с URL-адресом недавно выбранной статьи.
Одно из предлагаемых решений, основанных на обсуждении проблем WebCore, предложило установить свойство webviews delegate
в nil
в методе контроллера dealloc
. К сожалению, я не думаю, что это применимо в моем случае, потому что контроллер просмотра не освобождается в течение жизненного цикла приложения.
Другой проблемой могут быть неправильные веб-страницы с плохими ссылками на изображение в CSS (loadPendingImages crash). Однако я не мог найти такую страницу.
Кроме того, я дважды проверял и выполнял операции, связанные с веб-просмотром, в основном потоке.
Аварии
Exception Type: EXC_BAD_ACCESS
Code: KERN_INVALID_ADDRESS
со следующими трассировками стека (полный здесь)
0 WebCore WebCore::StyleResolver::applyMatchedProperties(WebCore::StyleResolver::MatchResult const&, WebCore::Element const*) + 815
1 WebCore WebCore::StyleResolver::applyMatchedProperties(WebCore::StyleResolver::MatchResult const&, WebCore::Element const*) + 788
2 WebCore WebCore::StyleResolver::styleForElement(WebCore::Element*, WebCore::RenderStyle*, WebCore::StyleSharingBehavior, WebCore::RuleMatchingBehavior, WebCore::RenderRegion*) + 948
3 WebCore WebCore::Document::styleForElementIgnoringPendingStylesheets(WebCore::Element*) + 96
4 WebCore WebCore::Element::computedStyle(WebCore::PseudoId) + 142
5 WebCore WebCore::ComputedStyleExtractor::propertyValue(WebCore::CSSPropertyID, WebCore::EUpdateLayout) const + 458
и
0 WebCore WebCore::StyleResolver::loadPendingImages() + 1153
1 WebCore WebCore::ResourceRequestBase::~ResourceRequestBase() + 104
2 WebCore WebCore::StyleResolver::applyMatchedProperties(WebCore::StyleResolver::MatchResult const&, WebCore::Element const*) + 782
3 WebCore WebCore::StyleResolver::styleForElement(WebCore::Element*, WebCore::RenderStyle*, WebCore::StyleSharingBehavior, WebCore::RuleMatchingBehavior, WebCore::RenderRegion*) + 948
4 WebCore WebCore::Document::styleForElementIgnoringPendingStylesheets(WebCore::Element*) + 96
5 WebCore WebCore::Element::computedStyle(WebCore::PseudoId) + 142
и
0 WebCore WebCore::StyleResolver::adjustRenderStyle(WebCore::RenderStyle*, WebCore::RenderStyle*, WebCore::Element*) + 19
1 WebCore WebCore::StyleResolver::styleForElement(WebCore::Element*, WebCore::RenderStyle*, WebCore::StyleSharingBehavior, WebCore::RuleMatchingBehavior, WebCore::RenderRegion*) + 964
2 WebCore WebCore::Document::styleForElementIgnoringPendingStylesheets(WebCore::Element*) + 96
3 WebCore WebCore::Element::computedStyle(WebCore::PseudoId) + 142
4 WebCore WebCore::ComputedStyleExtractor::propertyValue(WebCore::CSSPropertyID, WebCore::EUpdateLayout) const + 458
5 WebCore WebCore::CSSComputedStyleDeclaration::getPropertyValue(WebCore::CSSPropertyID) const + 42
и
0 WebCore WebCore::TimerBase::heapDeleteMin() + 37
1 WebCore WebCore::ThreadTimers::sharedTimerFiredInternal() + 94
2 WebCore WebCore::ThreadTimers::sharedTimerFiredInternal() + 94
3 WebCore WebCore::timerFired(__CFRunLoopTimer*, void*) + 24
4 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 14
5 CoreFoundation __CFRunLoopDoTimer + 782
Кто-нибудь испытал подобные аварии? Если да:
1. Есть ли способы их тиражирования?
2. Как можно отлаживать их без их тиражирования?
3. Какие исправления решают проблемы?
Спасибо!