Speicherverlust bei Verwendung von WKScriptMessageHandler

7

Ich bin mir nicht sicher, ob ich einen Fehler in WebKit gefunden habe oder etwas Schreckliches falsch mache, aber ich kann nicht herausfinden, wie WKScriptMessageHandler verwendet wird, ohne dass der in WKScriptMessage.body enthaltene Wert verloren geht.

Ich konnte ein minimales Mac-Projekt zusammenstellen, um das Problem zu isolieren, aber ohne Erfolg.

In der Hauptansicht Controller:

%Vor%

Und dann in der Datei index.html :

%Vor%

Wenn ich das Projekt starte, dann öffne den Speicher-Debugger in Instruments, ich sehe das folgende Leck:

Wenn ich eine Schaltfläche hinzufüge, mit der die Anforderung erneut geladen wird, und zwar einige Dutzend Mal, nimmt der Speicherbedarf der App zu und stürzt nach einem bestimmten Schwellenwert ab. Es könnte eine Weile dauern, bevor ich in diesem minimalen Beispiel stürze, aber in meiner App, wo ich mehrere Nachrichten pro Sekunde erhalte, dauert es weniger als 10 Sekunden, bis sie abstürzt.

Das ganze Projekt kann hier heruntergeladen werden.

Irgendeine Idee von was ist los?

    
Reda Lemeden 27.06.2015, 22:20
quelle

3 Antworten

5

Was Sie sehen, ist ein WebKit-Fehler: Ссылка . Es wurde vor einer Weile im WebKit-Stamm repariert , aber scheint nicht mit irgendwelchen WebKit Updates verschmolzen worden zu sein.

Sie können dies umgehen, indem Sie -dealloc zu WKScriptMessage hinzufügen, das die Übererhaltung kompensiert. Es könnte in etwa so aussehen:

%Vor%

Legen Sie dies in einer Objective-C-Datei in Ihrem Projekt ab, legen Sie die Compiler-Flags für diese Datei so fest, dass sie -fno-objc-arc enthalten, und es sollte sich um das Leck kümmern.

    
bdash 27.06.2015, 22:48
quelle
9

Ich habe das gleiche Problem beim iOS 9 SDK festgestellt.

Ich habe bemerkt, dass userContentController.addScriptMessageHandler(self, name: "handler") die Referenz des Handlers behält. Um Undichtigkeiten zu vermeiden, entfernen Sie einfach den Nachrichtenhandler, wenn Sie ihn nicht mehr benötigen. z.B. Wenn Sie den genannten Controller ablehnen, rufen Sie eine Aufräummethode auf, die removeScriptMessageHandlerForName() aufruft.

Sie könnten das addScriptMessageHandler() in viewWillAppear verschieben und entsprechende removeScriptMessageHandlerForName() Aufrufe in viewWillDisappear hinzufügen.

    
siuying 07.09.2015 17:22
quelle
4

Sie haben hier einen Retain-Zyklus. In Ihrem Code behält ViewController WKWebView, WKWebView behält WKWebViewConfiguration, WKWebViewConfiguration behält WKUserContentController und WKUserContentController behält Ihren ViewController bei. Wie im obigen Kommentar müssen Sie scriptHandler entfernen, indem Sie removeScriptMessageHandlerForName aufrufen, bevor Sie den View-Controller schließen.

    
Sahey 29.09.2016 09:38
quelle