我觉得我一直误解了何时创建引用循环。在我过去认为几乎任何你有一个块并且编译器强迫你写的地方之前,.self这表明我正在创建一个引用循环,我需要使用[weak self] in.
但以下设置不会创建参考循环。
import Foundation
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution
class UsingQueue {
var property : Int = 5
var queue : DispatchQueue? = DispatchQueue(label: "myQueue")
func enqueue3() {
print("enqueued")
queue?.asyncAfter(deadline: .now() + 3) {
print(self.property)
}
}
deinit {
print("UsingQueue deinited")
}
}
var u : UsingQueue? = UsingQueue()
u?.enqueue3()
u = nil
Run Code Online (Sandbox Code Playgroud)
该块仅保留self3 秒。然后释放它。如果我使用async而不是asyncAfter那么它几乎是立即的。
据我了解,这里的设置是:
self ---> queue
self <--- block
Run Code Online (Sandbox Code Playgroud)
队列只是块的外壳/包装器。这就是为什么即使我nil排队,块也会继续执行。他们是独立的。
那么是否有任何设置只使用队列并创建参考循环?
据我所知[weak self],仅用于引用循环以外的其他原因,即 …
closures memory-leaks memory-management grand-central-dispatch swift