For short-running operations, is it acceptable to avoid [weak self]
? For example, URLSession
will retain the closure from 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()
}
}
In this case, the closure captures self
strongly, which means even if this ViewController
is held in memory by the closure. URLSession
will hold the closure until the data task is complete, which means the life cycle of the ViewController
can potentially be extended until dataTask
completes.
In this situation, should we use capture lists to avoid this behavior? Is my reasoning correct that there's no reference cycle here?
the life cycle of the ViewController can potentially be extended until dataTask completes
So the question is whether that would be coherent. It might even be a good thing. If it would, then fine, and there’s no need for weak self
, as there is no retain cycle because the
url session is shared.
But when the url session is an instance property and has a real delegate, things are much more complicated and you really can get a retain cycle, because the session retains its delegate which might be retaining the session.