【发布时间】: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吗?然后请运行应用程序并在应用程序中打开屏幕 -includeMyAwsomeWebViewController。然后查看控制台,找到"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