释放 WKNavigationAction 子类在 iOS 15 崩溃
Releasing WKNavigationAction subclass crashes on iOS 15
为了单元测试,我将 WKNavigationAction
子类化了。这是一种常见的做法,也可以在互联网和大型 SDK 中找到。
在 iOS15 释放它的一个实例导致 WebKit 内部崩溃。
堆栈跟踪:
Thread 1 Queue : com.apple.main-thread (serial)
#0 0x0000000130d8b702 in WTF::RunLoop::dispatch(WTF::Function<void ()>&&) ()
#1 0x0000000134ed41e4 in WebCoreObjCScheduleDeallocateOnMainRunLoop(objc_class*, objc_object*) ()
#2 0x000000011290711d in -[WKNavigationAction dealloc] ()
#3 0x000000010cf2f9f7 in objc_object::sidetable_release(bool, bool) ()
游乐场示例:
import WebKit
class MockNavigationAction: WKNavigationAction {}
var navigationAction: WKNavigationAction? = MockNavigationAction()
navigationAction = nil
非常感谢有关如何解决此问题的建议。
似乎是 WebKit 错误,您需要启动框架,否则释放失败。
有时在 app/tests 启动期间创建一个虚拟网络视图:
_ = WKWebView()
此解决方法将修复崩溃,因为创建 WKWebView
将启动 WebKit 引擎,并且可能会初始化导致崩溃的值。
理论上,您不需要上面的代码,因为无论如何您都必须将 WKWebView
实例传递给委托方法。
为了单元测试,我将 WKNavigationAction
子类化了。这是一种常见的做法,也可以在互联网和大型 SDK 中找到。
在 iOS15 释放它的一个实例导致 WebKit 内部崩溃。
堆栈跟踪:
Thread 1 Queue : com.apple.main-thread (serial)
#0 0x0000000130d8b702 in WTF::RunLoop::dispatch(WTF::Function<void ()>&&) ()
#1 0x0000000134ed41e4 in WebCoreObjCScheduleDeallocateOnMainRunLoop(objc_class*, objc_object*) ()
#2 0x000000011290711d in -[WKNavigationAction dealloc] ()
#3 0x000000010cf2f9f7 in objc_object::sidetable_release(bool, bool) ()
游乐场示例:
import WebKit
class MockNavigationAction: WKNavigationAction {}
var navigationAction: WKNavigationAction? = MockNavigationAction()
navigationAction = nil
非常感谢有关如何解决此问题的建议。
似乎是 WebKit 错误,您需要启动框架,否则释放失败。
有时在 app/tests 启动期间创建一个虚拟网络视图:
_ = WKWebView()
此解决方法将修复崩溃,因为创建 WKWebView
将启动 WebKit 引擎,并且可能会初始化导致崩溃的值。
理论上,您不需要上面的代码,因为无论如何您都必须将 WKWebView
实例传递给委托方法。