【问题标题】:Releasing WKNavigationAction subclass crashes on iOS 15在 iOS 15 上发布 WKNavigationAction 子类崩溃
【发布时间】:2021-12-12 14:48:12
【问题描述】:

对于单元测试,我对WKNavigationAction 进行了子类化。这是一种常见的做法,也可以在互联网和大型 SDK 中找到。

在 iOS 15 上,发布它的实例会导致 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

非常感谢有关如何解决此问题的建议。

【问题讨论】:

    标签: ios swift webkit ios15


    【解决方案1】:

    好像是WebKit的bug,需要kickstart框架,否则释放失败。

    有时只需在应用/测试启动期间创建一个虚拟 webview:

    _ = WKWebView()
    

    此解决方法将修复崩溃,因为创建 WKWebView 将启动 WebKit 引擎,并且可能会初始化导致崩溃的值。

    理论上,您不需要上述代码,因为无论如何您都必须将 WKWebView 实例传递给委托方法。

    【讨论】:

    • 呸,这很难看。但确实有效。
    • @mbi,是的,这不是漂亮的代码,但理论上,你不应该需要它,因为无论如何你都必须为委托方法传递一个 WKWebView 实例。
    • 单元测试隔离代码在这里直接与WKNavigationAction一起工作
    猜你喜欢
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多