2014-09-27 22 views
6

Ich habe eine hierarchische Anwendung (NavigationController) mit einer einfachen Tabellenansicht in einer Rolle des Root-Controllers. Jedes Mal, wenn Sie eine Zelle auswählen, erhalten Sie eine neue Ansicht mit einigen Informationen zu den Details (verwaltet von DetailViewController). Auf der Seite von DetailViewControllers Ansicht habe ich ein UIWebView um Daten aus dem Internet anzuzeigen. Aber das Problem tritt auf, wenn ich die Speicherauslastung betrachte. Jede neu geöffnete Ansicht von DetailViewController, deren Inhalt über UiWebView aus dem Web geladen wird, bringt mehr Speicher mit Koeffizienten. Ich möchte alles entladen und den für diese Daten zugewiesenen Speicher freigeben, wenn ich zur Ansicht meines Root-Controllers zurückkehre.iOS 8 UIWebView Speicherverwaltung

Wie kann ich dieses Problem beheben? Ich habe versucht, stopLoading: UIWebView-Instanz-Methode, um etwas Speicher zu sparen, aber es löst auch nicht das Problem. Sowie ich ARC-Prozess der Arbeit nicht vollständig verstehe, kann ich mir selbst nicht versichern, wenn es normalerweise einen vergrößerten Speicher hat, der Koeffizienten mit jeder neuen geöffneten Detailansicht verwendet.

Vielen Dank im Voraus!

Antwort

9

Ein paar Dinge zu beachten. UIWebView "Lecks". Es ist seit mindestens iOS4 undicht. Bei jeder großen Seitenladung scheint es zu wachsen und der Speicher wird nicht vollständig aufgefüllt, wenn das UIWebView Objekt selbst freigegeben wird. Ob dieser Speicher in einem Cache verbleibt und freigegeben wird, wenn er wirklich benötigt wird, oder ein Leck, konnte ich nicht richtig beantworten. Dies hat sich im Laufe der Jahre etwas verbessert, kann aber immer noch mit dem Speicherzuweisungsgraphen von Instruments beobachtet werden.

Beginnen wir mit den Grundlagen. Bevor Sie beginnen, Änderungen an Ihrem Design vorzunehmen, versuchen Sie, Instrumente zu verwenden, um zu sehen, was genau undicht ist. Sie können Ihre Ansichten auch ableiten und Controller anzeigen, ihre Dealloc-Methoden implementieren und sicherstellen, dass sie korrekt freigegeben werden, wenn sie erwartet werden. Viele Male, besonders wenn Blöcke involviert sind, erstellen Leute Retain-Zyklen, die riesige Speicherlecks verursachen. Mach das zuerst.

Hier sind ein paar Empfehlungen aus meiner Erfahrung mit WebKit arbeiten:

  • Wiederverwendung des Web-Ansicht so viel wie möglich. Wenn Sie können, verwenden Sie dasselbe Objekt und fügen Sie es einfach als Unteransicht der View-Controller-Ansichten hinzu.
  • Wir bemerkten, dass das meiste, was wir aus der Webansicht drainieren konnten, das Öffnen einer leeren Seite war, bevor das UIWebView Objekt freigegeben wurde.
  • iOS8 unterstützt ein neues Modell mit der Arbeit mit WebKit: WKWebView (WebKit2). In diesem Modell wird der Webinhalt verwaltet und ausgelagert, und der Speicher wird in diesem Prozess "durchgesickert". Bei Bedarf wird das Betriebssystem diesen WebKit-Prozess beenden, sodass Ihre App ausgeführt werden kann. Sie können dies versuchen und sehen, ob Sie Verbesserungen haben.