在 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.1
、Swift 4
,并且安装了 Alamofire
和 NetworkReachability
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 提交错误报告,但至少这会让您暂时坚持下去。
在我的代码中,我有一个部分创建了一个新的 WKWebView
和一个特定的 WKWebViewConfiguration
,它又有一个 WKPreferences
引用。然后所有这些都被添加到应用程序的视图中。
问题是,到目前为止,我的代码一直运行 完美,没有任何问题。
现在,由于某些奇怪的原因,当我启动应用程序时, 我得到
Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffeec686fc0)
上线时我为[=15=]创建了一个变量。
我正在使用 Xcode 10.1
、Swift 4
,并且安装了 Alamofire
和 NetworkReachability
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 提交错误报告,但至少这会让您暂时坚持下去。