iOS 12+内存泄漏 - WKWebView和UIWebView

14

这不是一个问题,但我希望在此发布内容以期能够挽救其他人的神智(我刚刚花了大部分时间来解决这个问题)。我已经确定了从iOS 12.0+开始出现的内存泄漏,它影响WKWebView和UIWebView。泄漏出现在你实例化这两个Webview的时候。Instruments将泄漏标识为来自JavaScriptCore,这就是为什么它会同样影响两个Webview的原因。

当我试图找出我做错了什么时,我决定尝试较旧版本的iOS(11.4 - 在12.0之前的版本),我注意到泄漏已经消失了。我可以每次都复现。

要复制此问题,你只需要在类上分配Webview的一个实例即可。

let webview = WKWebView()
或者
let webview = UIWebView()

如果您在iOS 12.0/12.1上运行代码,会立即注意到4个泄漏,但在iOS 11.4上运行代码则不存在这4个泄漏。这里有4个单独的泄漏,3 x 96字节和1 x 128字节。

Leak-WKWebView

我已通过BugReporter向Apple报告了一个漏洞,并在Openradar上进行了复制:https://openradar.appspot.com/radar?id=6132657108811776


好消息是,我已经在iOS 13 Beta上进行了测试,这个问题似乎已经解决了!坏消息是,苹果可能不会为iOS 12变体修复此问题。 - CPR
2个回答

3

我也遇到了同样的问题。我在测试我的应用程序是否存在内存泄漏时,一旦打开UIWebView,就会出现这些精确的泄漏。

我认为这与来自baseurl的javascript有关,但将其设置为nil会产生相同的结果。这是我的webview设置:

NSURL *url = [NSURL URLWithString:@"https://example.com"];
[self.webView loadHTMLString: htmlContent baseURL: url];

希望苹果能尽快给我们提供一个解决方案。


有趣的是,你甚至不需要在webview中加载任何内容就能触发泄漏。苹果还没有回复我的错误报告。我一听到消息就会回复。很高兴你找到了我的帖子 :) - CPR
你尝试过这里发布的解决方案吗:https://dev59.com/qGQn5IYBdhLWcg3w36M1。也许在 viewWillDisappear 中将 URL 和 HTML 设置为 nil 会有所帮助?但是,如果你说仅仅实例化 UIWebView 就会导致内存泄漏,那么这就不重要了。我发现有趣的一件事是,复用 webview 不会引入任何新的泄漏,所以我认为只要你不创建很多 webviews,这并不是一个很大的问题。 - Null TX
是的,我尝试了所有可能的方法。唯一有效的方法是回到iOS11.X。一旦你再次切换到iOS12+,泄漏问题就会再次出现。 - CPR
1
我很惊讶更多的人还没有遇到它。我很高兴它能帮助到你,因为我花了将近一整天的时间去追踪它! - CPR
1
刚看到你的帖子,很高兴我不是唯一一个遇到这个问题的人。希望苹果能够解决这个问题。 - nodediggity
显示剩余2条评论

2

以下内容仅供参考(如果有人遇到类似问题)。

似乎在所有WKWebview版本中,使用evaluateJavascript存在另一个仍然活跃的内存泄漏bug。 https://bugs.webkit.org/show_bug.cgi?id=215729

我通过使用WebSocket通信作为向webview发送消息的替代方式,为其构建了一个解决方法。

如果您需要它以库的形式(Swift Package) https://github.com/Danesz/Sidewalk

(该软件包是一个PoC,但它可以帮助您克服此问题,并针对您自己的情况进行微调)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接