4 Stimmen

UIWebView Speicherleck

Ich habe eine iPad-App (IOS 4.3 & 5.0), die eine UIView mit mindestens 2 Unteransichten jedes Mal, wenn der Benutzer Seiten vor oder zurück erstellt. Die 2 Unteransichten sind UIWebView Objekte.

Bei jedem relevanten Wischen werden die alten UIWebViews entfernt und ordnungsgemäß freigegeben (removeFromSuperview dann stopLoading und Delegate auf null setzen) und die übergeordnete UIView wird freigegeben. Ich kann bestätigen, dass sowohl übergeordnete UIView und die 2 Kind-UIWebViews absolut weg sind.

Ich kann die Anzahl der beibehaltenen Webviews sehen, während sie entfernt werden, und ich bin ziemlich sicher, dass sie tatsächlich jedes Mal entfernt werden. Allerdings steigt meine Speicherzuweisung bei jedem Wischen um 200-350k. Keine Lecks im Instrument, aber ich kann sehen, dass die Speichernutzung langsam ansteigt. Auf dem iPad 1 erhält die App schließlich (innerhalb von 6-10 Minuten bei moderater Nutzung) mehrere Speicherwarnungen und wird beendet. LowMemory crash log...etc wird generiert.

Wir verwenden stringByEvaluatingJavaScriptFromString und loadRequest, um die WebViews aufzufüllen. Die Speichernutzung steigt auch dann an, wenn nichts in die WebViews injiziert oder geladen wird.

Hat jemand Erfahrung mit dieser Art von Verhalten mit UIWebViews? Hat jemand dieses Problem erfolgreich gelöst?

Für Anregungen, Kommentare und Antworten wären wir Ihnen sehr dankbar.

1voto

Mattias Wadman Punkte 10832

Versuchen Sie, Instruments zu verwenden, aber mit der Vorlage "Allocations" und beobachten Sie die Spalten "# Living" für UIWebView. Ich verwende es normalerweise so:

  1. Profil-App mit Zuweisungsvorlage
  2. "Warnen" Sie die App, indem Sie alle Registerkarten durchgehen, herumblättern usw.
  3. Klicken Sie auf "Heap markieren", um einen "Baseline"-Heapshot zu erstellen.
  4. Tun Sie das, wovon Sie glauben, dass die Objekte in der Nähe bleiben
  5. Drücken Sie erneut auf "Heap markieren", um einen "Heapshop #" Heapshot zu erstellen.
  6. Untersuchen Sie die Objekte im "Heapshop #", der die Größe und die Anzahl der seit dem letzten Heapshot erstellten und aktiven Objekte anzeigt.
  7. Gehe zu 4

0voto

Nick Lockwood Punkte 40439

Ich bin mir keiner undichten Stelle bewusst, aber wenn Sie dieselbe Ansichtshierarchie bei jeder Wischbewegung zerstören und neu erstellen, warum speichern Sie die Ansichten nicht und verwenden sie stattdessen wieder?

Unabhängig davon, ob sie undicht sind, sind Webviews rechenintensiv in der Einrichtung, so dass die Wiederverwendung von Webviews und das erneute Laden des Inhalts zu einem Leistungsschub führen sollte und möglicherweise auch das Leck löst.

0voto

1800 INFORMATION Punkte 125009

Tritt dieses Problem immer noch auf? Ich habe etwas verfolgt, das wie unbegrenzte Speichernutzung aussieht (nicht unbedingt ein Leck, aber ich erhalte Warnungen bei geringem Speicherplatz und eventuelle Prozessbeendigung), indem ich stringByEvaluatingJavaScriptFromString immer wieder aufrufe:

[webview stringByEvaluatingJavaScriptFromString:@"something()"];

Es scheint, als ob dort etwas seltsam ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X