用KVC绕过ObjC到Swift桥?

时间:2019-06-05 19:53:19

标签: ios objective-c swift objective-c-swift-bridge

最近在我们的应用程序中发生崩溃:

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快速桥接,那我们就要忍受崩溃了吗?它的发生频率不是太高,但是足以让我们愿意修复。

1 个答案:

答案 0 :(得分:1)

我认为在发生错误时假设requestnil是正确的。 here描述了类似的问题。
由于URLRequest.swift(如apple/swift-corelibs-foundation中定义的那样,如果请求为nil,引证的内容将最终崩溃,因此在这种情况下不能使用它。 一种选择是确定使用KVO,因为func value(forKey key: String) -> Any? 可以返回nil的值,请参见here
但是,只有在调用该函数的对象采用NSKeyValueCoding协议的情况下,才能使用它,如果该对象是NSObject的子类,则可以确保使用该协议,我无法从您的判断中得知代码片段。
但是既然您已经在问题中提出了这个建议,您是否尝试过?