【问题标题】:DispatchQueue and [weak self] workItems. Is [weak self] necessary?DispatchQueue 和 [weak self] workItems。 [弱自我] 有必要吗?
【发布时间】:2019-10-15 08:56:44
【问题描述】:

我有一个使用 DispatchQueue 的自定义类。

class MyCustomClass {

    func fetch(fromURL url: URL) {
        DispatchQueue.global().async { [weak self] in 
            // workItem stuff where self? is called
        }
    }

}

[弱自我]是必要的吗? workItem 闭包引用了 MyCustomClass 的实例,所以我看到了这个强引用,但是 MyCustomClass 的实例是否保留了对传递给 async() 的封闭 workItem 块的引用?好像没有,这种情况下[弱自己]是不是没必要?

【问题讨论】:

    标签: swift


    【解决方案1】:

    但是 MyCustomClass 的实例是否保留对传递给 async() 的封闭 workItem 块的引用?

    不是这个例子,不是。

    但是,如果 MyCustomClass 的实例使用 DispatchQueue 而不是全局队列,那么它将强烈引用工作时间,直到它完成。

    【讨论】:

    • 我可能误解了你的回答,但你是说如果我使用DispatchQueue.main.async 我应该使用[weak self]
    • @RIP.Ben.Franklin 不,如果你创建自己的自己的调度队列,并将对它的引用存储在MyCustomClass的实例中,那么 你会有一个强大的参考周期。
    【解决方案2】:

    不,不需要单身DispatchQueue.global()

    DispatchQueue.global().async
    

    没有对self 的强引用,GCD 不会导致保留周期

    【讨论】:

    • 感谢您的回答。为什么 GCD 不会导致保留周期?
    猜你喜欢
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    相关资源
    最近更新 更多