【问题标题】:WKWebView causes memory warning and the app is terminatedWKWebView 导致内存警告,应用程序被终止
【发布时间】:2019-11-19 01:16:47
【问题描述】:

我有一个带有 WKWebView 的简单应用程序。在 iOS 9 上运行时,由于 WKWebView 在单独的进程中运行,因此内存使用量保持在 5 Mb 左右,这是预期的。但是经过几次导航后,“其他进程”的内存使用率会很高,尤其是在重页上。当内存使用量达到其阈值时,应用程序会收到两次内存警告,然后终止。 webViewWebContentProcessDidTerminate 永远不会被调用。

我尝试以多种方式回复didReciveMemoryWarning,但均未成功。这是我尝试过的:

override func didReceiveMemoryWarning() {
   super.didReceiveMemoryWarning()
   print("**** MEMORY WARNING! ****")
   URLCache.shared.removeAllCachedResponses()
   URLCache.shared.diskCapacity = 0
   URLCache.shared.memoryCapacity = 0
}
override func didReceiveMemoryWarning() {
   super.didReceiveMemoryWarning()
   print("**** MEMORY WARNING! ****")
   DispatchQueue.main.async {
            WKWebsiteDataStore.default().fetchDataRecords(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes()) { records in
                records.forEach { record in
                    WKWebsiteDataStore.default().removeData(ofTypes: record.dataTypes, for: [record], completionHandler: {})
                    print("[WebCacheCleaner] Record \(record) deleted")
                }
            }
        }
}

这是我的代码:

import UIKit
import WebKit

class MyAwsomeWebViewController: UIViewController, WKNavigationDelegate {

    var page:WKWebView! = WKWebView()

    @IBOutlet weak var WKBaseView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        page.navigationDelegate = self
        if let url = URL(string: "https://hitta.se") {
            let request = URLRequest(url: url)
            page.load(request)
        }

    }

    override func loadView() {
        self.view = page
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        print("**** MEMORY WARNING! ****")
    }

    func webViewWebContentProcessDidTerminate(_ webView: WKWebView) {
        print("*** Terminate WebView Process ***")
    }


}

当我收到内存警告时,如何清除我的 WKWebViews 内存使用情况,以免应用崩溃?

【问题讨论】:

  • 你能把deinit { print("controller deinitialized") } 加入你的MyAwsomeWebViewController 吗?然后请运行应用程序并在应用程序中打开屏幕 -include MyAwsomeWebViewController。然后查看控制台,找到"controller deinitialized"文字。如果您找不到文本,则意味着您有一个保留周期。把所有初始化的对象都注释掉再运行一次,一个个打开cmets再运行一次。每次检查控制台上的"controller deinitialized" 文本。你一看到文本就打开评论的地方没有出现,这就是保留周期开始的地方。
  • Retain Cycle 导致Memory Leak 我认为你的问题是原因Memory Leak
  • 我创建了一个与MyAwsomeWebViewController 连接的视图控制器,并添加了deinit 函数。当我关闭MyAwsomeWebViewController 时,一切正常,我得到"controller deinitialized"。内存被清除。但是,这并不能解决我的问题,因为我不想每次加载页面时都取消我的 ViewContoler。
  • 您能否尝试在 Safari 移动浏览器中加载相同的页面并检查它的反应,通常是如果您在 Web 应用程序中加载重物并尝试在移动浏览器中加载相同的页面很痛苦,因为桌面的 CPU 资源比移动 CPU 大。您是否确定了您在网页中执行的哪些操作会导致内存峰值警告? @MartinClaesson
  • 是的,我尝试在 safari 中加载页面。它有时会显示错误消息并重新加载页面。这是我正在寻找的行为。我不希望它使我的应用程序崩溃。从我读到的关于 wkwebview 的内容来看,如果内存不足,它不应该让应用程序崩溃。它应该杀死 wkwebview 并触发 webViewContentProcessDidTerminate。

标签: ios swift memory wkwebview browser-cache


【解决方案1】:

WKWebView 仅适用于 iOS 8 及更高版本。我使用 Xcode 10.2.1 测试了您的代码,并且在浏览 WebView 时内存工作正常。

更新:对@Martin Claesson

【讨论】:

猜你喜欢
  • 2012-01-16
  • 2015-05-06
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多