ios - フォント - xcode viewcontroller title




再現不可能なウェブコアのクラッシュ (2)

私は約3ヶ月間App StoreにいるiPadアプリを手に入れている。私は理解できない奇妙なクラッシュレポートを受け取っている。 これらはあまり頻繁ではなく、打ち上げから約15〜20回のインスタンスがありますが、実際には私に迷惑をかけるほど頻繁です。 クラッシュは少し異なります(下のスタックトレースを参照してください)が、 WebCoreに関連しているので、アプリでUIWebViewを使用する必要があると推測していますが、一般的な原因があるかもしれませんが、100% 。 アプリの展開ターゲットはiOS 6.0ですが、iOS 7のみでiPad 2、iPad 3、iPad Miniにクラッシュが表示されます。

アプリケーションには、さまざまなソースからニュース記事のWebページを表示するために、私はwebviewを使用している場所が1つしかありません。 私はビューのUIWebViewを持ってこれのための1つのビューコントローラがあります。 このビューコントローラのインスタンスが1つあり、新しい記事が選択されるたびに、既存のwebviewが新しく選択された記事のURLでリロードされます。

WebCoreの問題に関する議論に基づいた提案されたソリューションの1つは、コントローラのdeallocメソッドでwebviews delegateプロパティをnilに設定することを提案しました。 残念ながら、ビューコントローラがアプリケーションのライフサイクル中に割り当て解除されないため、私のケースでは該当しないと思います。
別の問題は、CSSで不適切な画像参照がある不適切なWebページ(loadPendingImagesクラッシュ)が原因である可能性があります。 私はまだそのようなページを見つけることができませんでした。
また、私は二重チェックして、メインスレッドでwebview関連の操作を確実にしました。

クラッシュは

Exception Type: EXC_BAD_ACCESS 
Code: KERN_INVALID_ADDRESS

以下のスタックトレース( here完全なトレース)

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.どのような修正が問題を解決しましたか?

ありがとう!


JavascriptからObjective-Cへのコードを見てください.JavaScriptコードを実行している/呼び出している場合は、スクリプトがObjective-Cへの新しい呼び出しを呼び出さないようにしてください。

これは適切な使い方です:

Javascript >> Objective-C

Objective-C >> Javascript

これがクラッシュの理由です。

Objective-C >> Javascript >> Objective-C (競合条件によってはクラッシュする可能性があります)

ソリューションはプロジェクトコードに固有のものです。 しかし、最も簡単なのは、Javascriptスレッドで実行をスケジュールするために、すべてのJavascriptをsetTimeout()にラップすることです。 簡単な例ですが、Objective-Cコードでこのスクリプトを実行する必要があります:

storeUserPhoneNumber("011 123 4567");

storeUserPhoneNumber関数がObjective-Cコードを本体で(直接的または間接的に)呼び出すと、クラッシュが発生します。 setTimeoutに次のようにコードをラップするだけです。

setTimeout(function() {
    storeUserPhoneNumber("011 123 4567");
}, 0);

これが達成するのは、JavaScriptコードを解析してJSコードを解析した後にObjective-Cに戻す次のイベントループ・ティック・ティックで実行される予定の関数に配置することです。

Objective-C >> Javascriptすべての呼び出しでこの修正が必要であることを忘れないでください。


私が取り組んでいるアプリではまったく同じ問題がありました。これは、奇妙なことに、iOS 7を実行している古いデバイスでのみ発生していました。

私が持っていたのは、 UITableViewで、行の1つがカスタム広告のためにUIWebViewを持つUIViewControllerを開くUIViewControllerた。 私が見つけたのは、古いデバイスのオブジェクトとメモリでは、他のプラットフォームで見たよりもはるかに頻繁にfree'dすることです。 私はiPhone 4上で2〜3回画面を出入りすることでクラッシュを非常に簡単に模倣することができました。 どこでiPhone 5として私は同じことをやって15分過ごしたし、それを失敗することはできませんでした。

私はあなたのコントローラがdealloc'dされていないように感じるかもしれませんが、それは実際には、または一部の参照が削除されているように聞こえる、私はまた、私の代理人の参照がこのアプリでも数回消えて見てきました。

私のアドバイスと私のために働いたことは、webviewの実行を止め、できればすべてをnilにすることです。

私のアプリでは、私の状況ではユーザーから離れて再作成されたので、私はviewWillDisappearコールバックでそれを行うことにしました。

[webView stopLoading];

self.webView.delegate = nil;
self.webView = nil;






crash