微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

保留周期:弱引用理解和 PropertyWrapper

如何解决保留周期:弱引用理解和 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 举报,一经查实,本站将立刻删除。