SwiftUI中与UIKit View的deinit等价的生命周期方法是什么?
SwiftUI 中与 UIKit 视图 deinit 等价的实现方案
首先明确:onDisappear 确实无法作为视图永久销毁的判断依据,它仅在视图从渲染层级中移除时触发,导航跳转、页面遮挡、Tab 切换等临时移除场景都会触发该回调,和 UIKit 中 deinit 仅在实例永久释放时触发的逻辑完全不同。
核心实现思路
SwiftUI 视图本身是值类型,不存在 deinit 概念,我们可以通过绑定和视图生命周期的类实例的 deinit 来实现等价效果:SwiftUI 会自动管理 @State、@StateObject 包装的实例内存,生命周期和当前视图完全绑定,仅在视图永久销毁时释放对应实例才会被释放。
具体实现步骤
- 定义生命周期监听类
class DestroyObserver { let onDestroy: () -> Void init(onDestroy: @escaping () -> Void) { self.onDestroy = onDestroy } deinit { onDestroy() } }
- 封装为视图修饰符
- iOS 13+ 兼容版本:
extension View { func onDeinit(perform action: @escaping () -> Void) -> some View { background(State(wrappedValue: DestroyObserver(onDestroy: action))) } }
- iOS 14+ 稳定版本(使用
@StateObject更可靠):
class DestroyObserver: ObservableObject { let onDestroy: () -> Void init(onDestroy: @escaping () -> Void) { self.onDestroy = onDestroy } deinit { onDestroy() } } extension View { func onDeinit(perform action: @escaping () -> Void) -> some View { background(StateObject(wrappedValue: DestroyObserver(onDestroy: action))) } }
使用方式
直接在需要监听销毁的视图上添加修饰符即可:
struct TargetView: View { var body: some View { Text("测试页面") .onDeinit { // 这里的代码只会在视图永久销毁时执行,等价于 UIKit 的 deinit 逻辑 print("视图已永久销毁") } } }
验证说明
- 导航 push 到下一级页面时,当前页的
onDisappear会触发,但onDeinit不会执行 - 导航 pop 回上一级页面,当前页永久销毁时,
onDeinit才会执行,完全符合永久销毁的判断需求
内容的提问来源于stack exchange,提问作者zumzum
相关产品推荐
相关产品推荐

