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

UIHostingController承载SwiftUI页面销毁时@State变量引发App崩溃求助

崩溃原因

这是iOS 13系统中UIHostingController的已知内存管理缺陷,iOS 14及以上系统已修复该问题。
具体触发逻辑为:

  • @State属性的存储由SwiftUI框架底层统一管理,和承载它的UIHostingController生命周期强绑定
  • 当你直接通过替换rootViewController的方式销毁UIHostingController时(而非走导航栈pop、模态dismiss的标准页面关闭流程),系统会提前释放@State属性对应的内存空间
  • 后续UIKit层面销毁_UIHostingView时,会再次尝试释放关联的SwiftUI View持有的@State属性,触发野指针过度释放崩溃,和你提供的调用栈完全匹配。
可行修复方案
  • 优先调整页面关闭逻辑:如果业务允许,不走替换根视图的方式销毁二级页面,改用UINavigationController pop、dismiss模态页的标准流程销毁页面,即可避开该bug
  • 替换状态管理属性:将页面内的@State属性替换为@ObservedObject、外部传入的Binding变量,避开SwiftUI对内部@State属性的内存管理逻辑
  • 手动提前释放SwiftUI View:在执行根视图切换前,先将当前GenericViewController的rootView设置为EmptyView(),触发原有TestView的提前释放,再执行根视图替换操作,示例代码如下:
private func toIntroScreen() {
    // 先清空hostingVC的rootView
    if let hostingVC = UIApplication.shared.keyWindow?.rootViewController?.presentedViewController as? GenericViewController<TestView> {
        hostingVC.rootView = EmptyView() as! Content
    }
    WindowManager.shared().setRootWindow(type: .Intro)
}
  • 降级适配:如果业务侧允许,可以放弃iOS 13的版本兼容,或iOS 13下该页面改用UIKit实现。

内容的提问来源于stack exchange,提问作者Kenny Lim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:54:07