2015-02-09 4 views
6

Mein Projekt ist eine hybride statische Bibliothek zum Anzeigen eines UIWebView mit einigen JS zum Steuern der Logik. Wenn ich 64bit benutze und Demo auf iOS 8/iPhone 6 starte, läuft der Speicher auf 30M oder mehr!Speicherleck mit UIWebView

  1. Wenn ich Generation in Instrument verwende, ist die erhöhte Speicherauslastung fast alle von Webcore; Bedeutet es, dass es Lecks im JS-Code gibt? Ich kann kein Leck finden, wenn ich Safari verwende, um ähnliche JS direkt auszuführen.

  2. Wenn ich die UIWebView freigeben, wird der Speicher immer noch nicht freigegeben; Ich habe mit der Instrumentenverteilung getestet. Es gibt einige WebCore und (nicht - Objekt) noch im Speicher, was kann ich tun, um sie zu veröffentlichen?

    • 0JavaScriptCore WTF MallocHook :: :: recordAllocation (void *, unsigned long)
    • 1 Javascript WTF :: fastMalloc (unsigned long)
    • 2 WebCore WebCore :: :: SharedBuffer Puffer() const
    • 3 WebCore WebCore SharedBuffer :: :: data() const
    • 4 WebCore WebCore :: :: Resource didReceiveDataOrBuffer (char * const unsigned int, WTF :: PassRefPtr, long long, WebCore :: DataPayloadType)
    • 5 WebCore WebCore :: SubresourceLoader :: di dReceiveDataOrBuffer (char const *, int, WTF :: PassRefPtr, long long, WebCore :: DataPayloadType)
    • 6 WebCore WebCore SubresourceLoader :: :: didReceiveBuffer (WTF :: PassRefPtr, long long, WebCore :: DataPayloadType)
    • 7 WebCore WebCore :: :: Resource didReceiveBuffer (WebCore :: ResourceHandle *, WTF :: PassRefPtr, int)
    • 8 WebCore WebCore SynchronousResourceHandleCFURLConnectionDelegate :: :: didReceiveDataArray (__ CFArray const *)

I Verwenden Sie den folgenden Code.

Ich habe die folgenden Links recherchiert, aber sie scheinen mein Problem nicht zu lösen. Läuft UIWebview in iOS 8 noch? Und das Problem scheint nicht so offensichtlich, wenn ich iOS 6 in iPhone4 verwende.

Whats the proper way to release a UIWebView?

iOS 8 UIWebView memory management

UIWebView leaks, JS Garbage Collector & WebCore VMs

Release memory/cookie/cache from UIWebView once closed

Antwort

6

Ich war das gleiche Problem und wechselte zu den neuen WKWebView und sofort alle Speicherleck Probleme gelöst ich sehen war. WKWebView teilt viele der gleichen Rufnamen von UIWebView, so alles, was ich auf meinem Projekt tun musste, ist umschalten alle meine 'UIWebView' Objekte zu 'WKWebView' und die Speicherlecks ging weg.

Denken Sie daran, die WebKit in Ihr Projekt zu importieren und zu wissen, dass es nur unter iOS8 verfügbar ist.

Apple Documentation

+0

'WKWebView' erbt nicht von' UIWebView', es ist eine völlig neue und andere Klasse. Wenn Sie nur auf iOS 8 arbeiten, sollten Sie es unbedingt über 'UIWebView' verwenden. Sie sollten auch ARC verwenden. –

+0

@jshier - Danke für den Fang ... Ich habe die Antwort von dem, was ich sagen wollte, bearbeitet (Was sie teilen viele der gleichen Methode Anrufnamen macht es eine sehr einfache Umstellung). –

+0

Vielen Dank für Ihre Lösung, WKWebView funktioniert für meinen Fall! –

0

Ich hatte ein ähnliches Problem, mit den Benutzern durch die App testen Bilder in UIWebView Vorschau. Die App würde nach N Vorschauen abstürzen. Verwenden des Apple Instruments-Tools mit der Profilierungsvorlage "Allocations". Aus dem Tool konnte ich die folgende Allocation Lifespan auswählen: "Created & Persistent". Weitere Beobachtungen finden Sie, wenn Sie die gleiche Datei mehrmals hintereinander anzeigen. Persistente Bytes (Basierend auf der Apple-Definition ist dies die Anzahl der Bytes, die zugewiesen, aber nicht freigegeben wurden.) Für ImageIO_jpeg_Data wächst im Doppel, dies gilt für jeden anderen Bildtyp .

Eine Auflösung dafür ist, UIImageView von Apple als separate Vorschau für Bilder zu verwenden, dies verursacht keine Speicherverluste bei der Vorschau von Bildern.