传入Swift结构体的delegate属性是否也需要在结构体中声明为weak?
问题解答
不需要给结构体ExampleView内部的delegate属性添加weak标记,核心原因如下:
- 引用循环的核心前提是两个引用类型互相强持有,而SwiftUI的
View协议的实现类型都是结构体(值类型),值类型的生命周期完全由其作用域决定,作用域结束后就会自动销毁,不会和引用类型形成长时间的持有关联。 - 你代码中创建的
ExampleView实例本质只是视图的描述数据,而非实际运行的视图对象:它被传入UIHostingController之后,系统只会读取它的配置生成真正的渲染视图,不会长期持有这个结构体实例本身,因此哪怕ExampleView的delegate是强引用,也不会形成ViewController → UIHostingController → ExampleView → ViewController的持久强引用循环。 - 额外说明:Swift语法上允许值类型的属性使用
weak修饰,但在这个场景下完全没有必要。如果你确实需要在SwiftUI视图逻辑中持有类对象的引用避免内存问题,更合理的方案是把delegate包裹在遵循ObservableObject协议的类类型中间层里,而非给结构体属性加weak。
补充验证:你可以在
ViewController的deinit方法里加打印测试,当前代码在hostingController被dismiss之后,ViewController的deinit会正常触发,不会出现内存泄漏。
内容的提问来源于stack exchange,提问作者Curiosity
相关产品推荐
相关产品推荐

