我知道当我们直接在代码中调用时,我们可以在Dispatchmines中使用强self ,例如:

func foo() {
    DispatchQueue.global().async {
        print(self.someProperty)
    }
}

但是,如果我将我的自定义队列保留在类中,那么它会怎样呢?我应该使用weak self还是它的工作原理相同,无需担心泄漏?

class MyClass {
    
    let queue = DispatchQueue(
        label: "MyQueue",
        qos: .userInitiated
    )
    
    func foo() {
        queue.async { [weak self] in
            guard let self else { return }
            print(self.someProperty)
        }
    }
}

在这种情况下,我的自定义队列存储在类变量中,可能应该使用weak self.还是不go ?

推荐答案

queue.async关闭确实保留了self而没有[weak self].不过,这是暂时的,在出队时会立即消失.所以这里没有保留周期.

AFAIK,它更像是数据流,而不是保留周期.

  • [weak self]:您可能想尽早退出范围.
  • 没有[weak self]:您想要保留对象,直到执行该块.

Swift相关问答推荐

如何避免使用DispatchSemaphores时线程爆炸?

如何在HStack中均匀分布视图?

ARRaycast Query和前置摄像头(ARFaceTrackingConfiguration)

SWIFT异步/等待,多个监听程序

从任务中打印

如何在 Vapor 中制作可选的查询过滤器

如何通过 Enum 属性使用新的 #Predicate 宏获取

OSX 中的 Popover 无法确定透明度

为什么无法在 Swift 中使用AVFoundation扫描 QRCode

列表不显示信息

数组中某些元素的总和

SwiftUI 动画的范围

Reality Composer Tap Trigger 问题

Swift 2.0 方法不能标记为@objc,因为参数的类型不能在 Objective-C 中表示

Swift 函数 vs 惰性变量 vs 计算(computed)属性 - 区别?

不支持用作符合协议 AnyObject 的具体类型

subscribeOn 和 observeOn 的顺序重要吗?

如何使用 swift 将 Images.xcassets 中的图像加载到 UIImage 中

Swift 中的 CommonHMAC

如何在 Swift 中从字符串创建类的实例