ho provato con stesso modo come lei ha ricordato. Funziona perfettamente per me. Codice che ho provato è,
class CustomWKWebView : WKWebView {
deinit {
print("CustomWKWebView - dealloc")
}
}
class LeakAvoider : NSObject, WKScriptMessageHandler {
weak var delegate : WKScriptMessageHandler?
init(delegate:WKScriptMessageHandler) {
self.delegate = delegate
super.init()
}
func userContentController(userContentController: WKUserContentController,
didReceiveScriptMessage message: WKScriptMessage) {
self.delegate?.userContentController(
userContentController, didReceiveScriptMessage: message)
}
deinit {
print("LeakAvoider - dealloc")
}
}
class ChildViewController: UIViewController , WKScriptMessageHandler{
var webView = CustomWKWebView()
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
}
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(webView)
webView.frame = self.view.bounds;
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
let url = NSURL(string: "https://appleid.apple.com")
webView.loadRequest(NSURLRequest(URL:url!))
webView.configuration.userContentController.addScriptMessageHandler(
LeakAvoider(delegate: self), name: "dummy")
}
func userContentController(userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage)
{
}
deinit {
print("ChaildViewController- dealloc")
webView.stopLoading()
webView.configuration.userContentController.removeScriptMessageHandlerForName("dummy")
}
}
class ViewController: UIViewController {
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
}
override func viewDidLoad() {
super.viewDidLoad()
}
deinit {
print("ViewController - dealloc")
}
}
Log dopo popping ViewController è:
ViewController - dealloc
ChaildViewController- dealloc
LeakAvoider - dealloc
CustomWKWebView - dealloc
UPDATE
Mettere sotto le linee in funzione viewWillDisappear del WebViewViewController.
webView.navigationDelegate = nil
webView.scrollView.delegate = nil
Ho provato impostando questi due delegati nel mio codice e ha iniziato a bloccarsi. Risolto mettendo sopra le righe in vista WillDisappear di ChildViewController.
fonte
2016-03-10 04:36:37
Wow. Grazie! Abbiamo sbattuto la testa su questo, puoi spiegare come è stato scoperto? – shannoga
@shannoga appare come 'WKWebView' memorizza il puntatore' __unsafe_unretained' sul tuo delegato. Talvolta sulla visualizzazione Web deallocata non immediatamente dopo la deallocazione del controller di visualizzazione e questo arresto anomalo si verifica quando la visualizzazione Web tenta di notificare qualcosa al delegato. –