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
:
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?
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:
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.
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.
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.
Tags und Links memory-leaks ios macos webkit javascriptcore