如何解决保留周期:弱引用理解和 PropertyWrapper
您好,我有一个控制器,其中包含一个由 propertyWrapper
包装的属性。
我写了一个 DI 模式
我注意到当我关闭视图控制器时,我的依赖项的 deinit
没有被调用(显然某处有一个保留循环)
class Myviewmodel {
init() {
print("Init called")
}
deinit {
print("Deinit called")
}
}
class ViewController: UIViewController {
@Resolve var viewmodel: Myviewmodel
}
@propertyWrapper
struct Resolve<T> {
var service: T = DependencyInjector.dependencies.resolve()
var wrappedValue: T { service }
}
使用上面的代码,当我关闭 viewController 时,有一个未调用 viewmodel 的 deinit 的保留循环(因为我认为它已传递给 propertyWrapper
),viewController
保留在内存中因为属性包装器
所以我修改了它们,使变量 service
为 weak
:
@propertyWrapper
struct Resolve<T> {
weak var service: AnyObject?
init() {
let service: T = DependencyInjector.dependencies.resolve()
self.service = service as AnyObject
}
var wrappedValue: T {
return service as! T
}
}
现在只要我打开控制器,就会打印到控制台:
Init called
Deinit called
我不明白为什么调用 deinit
因为控制器仍然存在,
通常只要 property
在范围内,它就不应该被释放
只要 viewmodel
未被解除,ViewController
属性就在范围内。那么为什么在 deinit
init
下面是解除 viewController
后的内存图(使用没有 propertyWrapper
的 weak
)
我们可以看到 viewController
和 viewmodel
之间的箭头是粗体的。
我希望在解除 viewController
时未分配财产
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。