次のように、クロージャーで保持サイクルを実験しています
class Sample {
deinit {
print("Destroying Sample")
}
func additionOf(a: Int, b:Int) {
print("Addition is \(a + b)")
}
func closure() {
dispatch_async(dispatch_get_global_queue(0, 0)) { [weak self] in
self?.additionOf(3, b: 3)
usleep(500)
self?.additionOf(3, b: 5)
}
}
}
後である時点で、私はやっています
var sample : Sample? = Sample()
sample?.closure()
dispatch_async(dispatch_get_global_queue(0, 0)) {
usleep(100)
sample = nil
}
出力は次のようになります。
Addition is 6
Destroying Sample
これは理解できますself
。self?.additionOf(3, b:5)
[weak self]
次のように参照する別の変数を作成して、クロージャー内で変更を加えた場合
dispatch_async(dispatch_get_global_queue(0, 0)) { [weak self] in
guard let strongSelf = self else { return }
strongSelf.additionOf(3, b: 3)
usleep(500)
strongSelf.additionOf(3, b: 5)
}
今回の出来上がりは
Addition is 6
Addition is 8
Destroying C
私の質問は、なぜstrongSelf
nil out after でないのかということですsample = nil
。前にクロージャー内に取り込まれているからでしょうかsample = nil