问题描述
您好,我有一个控制器,其中包含一个由 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 (将#修改为@)