Я работаю над приложением Mac, написанным на Swift, которое загружает веб-сайт в WKWebView
, используя следующий код:
let webConfiguration = WKWebViewConfiguration()
webConfiguration.websiteDataStore = WKWebsiteDataStore.nonPersistent() //set it to "private browsing"
self.webview = WKWebView(frame: .zero, configuration: webConfiguration)
self.webview?.uiDelegate = self
self.webview?.navigationDelegate = self
self.view.addSubview(self.webview!)
let myURL = URL(string: "http://127.0.0.1:8000/")
let mRequest = URLRequest(url: myURL!, cachePolicy: NSURLRequest.CachePolicy.reloadIgnoringLocalAndRemoteCacheData)
self.webview?.load(mRequest)
Затем нативный код вызывает функцию javascript на сайте, используя:
self.webview?.evaluateJavaScript("randomjsfunction('" + secret + "')", completionHandler: nil)
Функция Javascript существует и работает правильно (она просто удаляет элемент со страницы, больше ничего).
После этого WKWebView удаляется вместе с родителем NSViewController
, используя:
let myURL = URL(string: "about:blank")
let mRequest = URLRequest(url: myURL!)
self.webview?.load(mRequest)
self.webview?.invalidateRestorableState()
self.webview?.stopLoading()
self.webview?.removeFromSuperview()
self.webview?.uiDelegate = nil
self.webview?.navigationDelegate = nil
self.webview = nil
self.removeFromParent()
self.dismiss(self.parent)
Через несколько минут я создаю дамп памяти процесса, и вызов функции Javascipt вместе с переданными параметрами все еще присутствует в памяти:
Мне нужно убедиться, что параметры вызова Javascript удаляются из памяти, когда он больше не используется.Однако даже уничтожение всего веб-обзора, кажется, не освобождает эту память.
Я пытался добавить вызов JS в usercript, используя функцию addUserScript()
, а затем вызывать эту функцию с помощью evaluateJavaScript()
, но дажеaddUserScript()
вызовы представлены в памяти.
На основании WebPage RunJavaScriptInMainFrame
, представленного в дампе, я нашел основную функцию в коде WebKit .Но я не знаю, как продвинуться в этом направлении.