Nie jestem pewien, czy trafiłem błąd w WebKit
lub robię coś okropnie nie tak, ale nie mogę wymyślić, jak użyć WKScriptMessageHandler
bez powodowania przecieku jakiejkolwiek wartości zawartej w WKScriptMessage.body
.Przeciek pamięci podczas korzystania z WKScriptMessageHandler
Udało mi się zebrać minimalny projekt Mac, aby wyizolować problem, ale bez skutku.
W głównym kontrolerem Widok:
class ViewController: NSViewController {
var webView: WKWebView?
override func viewDidLoad() {
super.viewDidLoad()
let userContentController = WKUserContentController()
userContentController.addScriptMessageHandler(self, name: "handler")
let configuration = WKWebViewConfiguration()
configuration.userContentController = userContentController
webView = WKWebView(frame: CGRectZero, configuration: configuration)
view.addSubview(webView!)
let path = NSBundle.mainBundle().pathForResource("index", ofType: "html")
let url = NSURL(fileURLWithPath: path!)!
webView?.loadRequest(NSURLRequest(URL: url))
}
}
extension ViewController: WKScriptMessageHandler {
func userContentController(userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage) {
print(message.body)
}
}
a następnie w pliku index.html
:
<html>
<head></head>
<body>
<script type="text/javascript">
webkit.messageHandlers.handler.postMessage("Here's a random number for you: " + Math.random() * 10)
</script>
</body>
</html>
Kiedy uruchomić projekt, a następnie otworzyć debuggera pamięci w instrumenty, widzę po wycieku:
Jeśli dodaję przycisk, który ponownie ładuje żądanie, i robi to kilkadziesiąt razy, ślad pamięci aplikacji rośnie i ulega awarii po przekroczeniu pewnego progu. Może minąć trochę czasu zanim nastąpi awaria w tym minimalnym przykładzie, ale w mojej aplikacji, w której otrzymuję kilka wiadomości na sekundę, awarie trwają mniej niż 10 sekund.
Cały projekt może być downloaded here.
Masz pojęcie o tym, co się dzieje?
Genialny! Dzięki wielkie! –