在 Swift 4 中创建 WKPreferences 变量时如何修复 "EXC_BAD_ACCESS"

How to fix "EXC_BAD_ACCESS" when creating WKPreferences variable in Swift 4

在我的代码中,我有一个部分创建了一个新的 WKWebView 和一个特定的 WKWebViewConfiguration,它又有一个 WKPreferences 引用。然后所有这些都被添加到应用程序的视图中。

问题是,到目前为止,我的代码一直运行 完美,没有任何问题。

现在,由于某些奇怪的原因,当我启动应用程序时, 我得到

Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffeec686fc0)

上线时我为[=​​15=]创建了一个变量。

我正在使用 Xcode 10.1Swift 4,并且安装了 AlamofireNetworkReachability pods。我试过只创建 WKWebView 而没有 WKPreferences,但错误只是转移到 WKWebViewConfiguration

func createWebView() {
    let preferences = WKPreferences()   //<-- EXC_BAD_ACCESS
    preferences.javaScriptEnabled = true
    let webConfiguration = WKWebViewConfiguration()
    webConfiguration.preferences = preferences
    webConfiguration.allowsInlineMediaPlayback = true
    webViewVar = WKWebView(frame: self.view.bounds, configuration: webConfiguration)
    webViewVar.uiDelegate = self
    self.view = webViewVar
}

override func loadView() {
    createWebView()
}

预期的行为是应用程序将启动并显示网页,该网页不会更改,在代码的其他地方指定。实际结果是应用程序在启动时崩溃并出现 EXC_BAD_ACCESS 错误。

我不得不说你发现了一个错误。出于某种原因,运行时不允许您在应用程序生命周期的早期创建 WKPreferences 对象。

解决方法是您必须将 Web 视图的创建推迟到应用程序启动并且 运行。为此,请删除 loadView 并改为实施 viewDidLoad,并在那里完成所有工作,使 Web 视图成为主视图的 子视图 而不是尝试使其成为主视图。

var webViewVar : WKWebView!
func createWebView() {
    let preferences = WKPreferences()
    preferences.javaScriptEnabled = true
    let webConfiguration = WKWebViewConfiguration()
    webConfiguration.preferences = preferences
    webConfiguration.allowsInlineMediaPlayback = true
    webViewVar = WKWebView(frame: self.view.bounds, configuration: webConfiguration)
    webViewVar.uiDelegate = self
    self.view.addSubview(webViewVar)
    webViewVar.autoresizingMask = [.flexibleWidth, .flexibleHeight]
}
override func viewDidLoad() {
    super.viewDidLoad()
    createWebView()
}

这很烦人,您应该向 Apple 提交错误报告,但至少这会让您暂时坚持下去。