保留周期:弱引用理解和 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 后的内存图(使用没有 propertyWrapperweak

enter image description here

我们可以看到 viewController viewmodel间的箭头是粗体的。

我希望在解除 viewController 时未分配财产

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)