You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中设置WKWebView的layer.sublayers为nil引发诡异崩溃

问题:WKWebView子类设置layer.sublayers = nil引发延迟崩溃

这是此前问题的后续。在tableView行选中方法中,主线程执行完Tracker.track("completed didSelect")后发生崩溃,崩溃信息显示崩溃点位于libobjc.A.dylib的objc_msgSend方法中。

通知触发的回调函数已标记@objc,经排查确认崩溃由mediaDisplay!.layer.sublayers = nil引发,但崩溃并非在该行代码执行时发生,而是在发送通知的原方法执行完毕之后才出现。mediaDisplay是WKWebView的子类,此前作为UIView子类使用时无此问题,改为WKWebView子类后才出现该崩溃。此外,即便触发崩溃,path!.renderBeziers仍能正常绘制内容,设置mask = nil也不会导致崩溃,现寻求该问题的原因及解决办法。

相关代码

tableView行选中方法

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    Tracker.track("getting row \(indexPath.row)")
    let ptv = tableView as? NovilloTableView
    if ptv!.uiType == .textTable {
        let gp = Projects.currentProject?.getPaths(type: PaletteView.getCurrentPane())
        GitPaths.currentGitPath = gp![indexPath.row]
//            NotificationCenter.default.post(name: NNames.updateWebText.nn(), object: nil)
        return
    }
    let svgs = Projects.currentProject!.getPaths(type : PaletteView.getCurrentPane())
    var gitPath = svgs[indexPath.row]
    Tracker.track("gitpath is \(gitPath)")
    var gitPaths = GitPaths.getMediaBoundingBoxes(paths: [gitPath])
    guard let pathArrays = gitPath.parseForRegBeziers() else { return }
    let rslt = pathArrays.0
    let regBeziers = pathArrays.1
    gitPath.boundingBox = gitPath.getBoundsParamsForPaths(src: regBeziers.isEmpty ? rslt : regBeziers)
    GitPaths.currentGitPath = gitPath
//        Tracker.track("sending notification")
    NotificationCenter.default.post(name: NNames.updateMedia.nn(), object: nil, userInfo: ["path" : gitPath])
    Tracker.track("completed didSelect")
    return
}

通知回调方法

@objc func updateMedia(notification : Notification) {
    let path = (notification.userInfo?["path"] ??  GitPaths.currentGitPath!) as? GitPaths
    Tracker.track("sublayers: \(mediaDisplay!.layer.sublayers == nil)")
    mediaDisplay!.layer.sublayers = nil
    mediaDisplay!.mask = nil
//        Tracker.track("render beziers for \(path)")
//        path!.renderBeziers(tgt: mediaDisplay!, path : path) //, data:["style" : "media"])
//        refreshMediaInfo()
//        updateSelectedMedia( src : GitPaths.currentGitPath! )
//        return
}

内容的提问来源于stack exchange,提问作者Dan Donaldson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 03:46:10