【发布时间】:2020-06-01 11:51:27
【问题描述】:
对于短期运行的操作,是否可以避免使用[weak self]?例如,URLSession 将保留来自dataTask(with:completion:) 的闭包:
final class ViewController: UIViewController {
let label = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data else { return }
let decodedString = String(bytes: data, encoding: .utf8)
DispatchQueue.main.async {
self.label.text = decodedString
}
}.resume()
}
}
在这种情况下,闭包会强烈捕获self,这意味着即使这个ViewController 被闭包保存在内存中。 URLSession 将保持关闭直到数据任务完成,这意味着 ViewController 的生命周期可能会延长到 dataTask 完成。
在这种情况下,我们应该使用捕获列表来避免这种行为吗?我的推理是否正确,这里没有引用循环?
【问题讨论】:
标签: ios swift memory-management urlsession