最近在我们的应用程序中发生崩溃:
EXC_BREAKPOINT 0x00000001c5c8986c
static URLRequest._unconditionallyBridgeFromObjectiveC(_:)
它来自我们访问请求属性的webView决策策略:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
let req = navigationAction.sourceFrame.request
}
我相信问题在Swift lib的这一行上: https://github.com/apple/swift-corelibs-foundation/blob/master/Foundation/URLRequest.swift#L298
这里没有保护措施,而且在objc方面,请求可能为零。
我的问题是关于如何绕过objc快速桥接。 KVC会避免这种情况吗?
if let req = navigationAction.sourceFrame.value(forKey: "request") as NSURLRequest {
//do stuff
}
如果没有办法绕过objc快速桥接,那我们就要忍受崩溃了吗?它的发生频率不是太高,但是足以让我们愿意修复。
答案 0 :(得分:1)
我认为在发生错误时假设request
是nil
是正确的。 here描述了类似的问题。
由于URLRequest.swift
(如apple/swift-corelibs-foundation
中定义的那样,如果请求为nil
,引证的内容将最终崩溃,因此在这种情况下不能使用它。
一种选择是确定使用KVO,因为func value(forKey key: String) -> Any?
可以返回nil
的值,请参见here。
但是,只有在调用该函数的对象采用NSKeyValueCoding
协议的情况下,才能使用它,如果该对象是NSObject
的子类,则可以确保使用该协议,我无法从您的判断中得知代码片段。
但是既然您已经在问题中提出了这个建议,您是否尝试过?