gpt4 book ai didi

ios - WKWebView 导致我的视​​图 Controller 泄漏

转载 作者:IT王子 更新时间:2023-10-29 07:33:58 25 4
gpt4 key购买 nike

我的 View Controller 显示一个 WKWebView。我安装了一个消息处理程序,这是一个很酷的 Web Kit 功能,它允许我的代码从网页内部得到通知:

override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
let url = // ...
self.wv.loadRequest(NSURLRequest(URL:url))
self.wv.configuration.userContentController.addScriptMessageHandler(
self, name: "dummy")
}

func userContentController(userContentController: WKUserContentController,
didReceiveScriptMessage message: WKScriptMessage) {
// ...
}

到目前为止一切顺利,但现在我发现我的 View Controller 正在泄漏 - 当它应该被释放时,它并没有:

deinit {
println("dealloc") // never called
}

似乎仅仅将自己安装为消息处理程序会导致保留周期并因此导致泄漏!

最佳答案

像往常一样正确,星期五国王。结果是 WKUserContentController 保留了它的消息处理程序。这在一定程度上是有道理的,因为如果它的消息处理程序不复存在,它就很难向它的消息处理程序发送消息。例如,它类似于 CAAnimation 保留其委托(delegate)的方式。

但是,它也会导致保留循环,因为 WKUserContentController 本身正在泄漏。这本身并不重要(它只有 16K),但是 View Controller 的保留周期和泄漏很糟糕。

我的解决方法是在 WKUserContentController 和消息处理程序之间插入一个蹦床对象。 trampoline 对象只有对真实消息处理程序的弱引用,因此没有保留循环。这是蹦床对象:

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)
}
}

现在,当我们安装消息处理程序时,我们安装了 trampoline 对象而不是 self:

self.wv.configuration.userContentController.addScriptMessageHandler(
LeakAvoider(delegate:self), name: "dummy")

有效!现在 deinit 被调用,证明没有泄漏。看起来这不应该起作用,因为我们创建了 LeakAvoider 对象并且从未持有对它的引用;但请记住,WKUserContentController 本身正在保留它,所以没有问题。

为了完整起见,现在调用了 deinit,您可以在那里卸载消息处理程序,但我认为这实际上不是必需的:

deinit {
println("dealloc")
self.wv.stopLoading()
self.wv.configuration.userContentController.removeScriptMessageHandlerForName("dummy")
}

关于ios - WKWebView 导致我的视​​图 Controller 泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26383031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com