iOS SwiftUI键盘扩展(UIHostingController)内存过高及峰值问题求助
彻底销毁UIHostingController实例,别只替换rootView
之前仅把rootView换成EmptyView的操作不够彻底,要在键盘消失时(比如viewDidDisappear或willResignActive回调里)直接销毁整个hostingController实例,断开所有强引用:override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) hostingController?.view.removeFromSuperview() hostingController = nil // 直接置空,切断强引用链 }同时检查KeyboardWrapper或其他关联代码,确保没有对hostingController的隐性强引用(比如闭包没加
weak/unowned,代理用了强引用)。清理SwiftUI视图的不必要引用
确保SwiftUI视图里没有持有外部对象的强引用,比如引用inputViewController时要用weak var;用@ObservedObject替代@StateObject管理跨生命周期的状态,这样可以在键盘销毁时手动释放对象。另外,哪怕注释了图片HStack,也要检查全局图片缓存是否未清空——如果用了自定义缓存,要在键盘失活时主动清理;用系统Image组件的话,确保没有强制保留缓存的逻辑。利用键盘生命周期主动释放资源
借助键盘扩展的willResignActive回调,在键盘切换到后台时主动释放非必要资源:清空数据模型、取消未完成的网络请求、清理临时缓存。避免在SwiftUI里持有大量静态数据或单例对象,要是必须用单例,得给它加个清理方法,在键盘失活时调用。用Xcode工具定位泄漏点
打开Xcode的Memory Graph Debugger,多次切换键盘后捕获内存图,查找UIHostingController、SwiftUI视图相关的未释放实例,看清楚是哪个对象在持有它们不释放——这是定位核心泄漏点最直接的方法。优化hostingController的初始化时机
别提前初始化hostingController,等键盘首次激活(比如viewDidAppear)时再创建,避免闲置时占用内存。如果要复用hostingController,复用前必须彻底清理之前的rootView和关联状态,不能只简单替换rootView。
内容的提问来源于stack exchange,提问作者Bolic

