Should one always use [weak self] to avoid retain cycles?
It has become pretty common among Swift experts to always use
[weak self] inside of a closure to avoid retain cycles.
[weak self] needed or even recommended inside of all closures?
The answer is NO.
First of all
[weak self] is only required for escaping closures that capture
self. Escaping closures is just a fancy name for closures that get stored and do not get executed immediately, unlike the non-escaping ones.
Non-escaping closures do not pose a risk of introducing strong reference cycles, and therefore do not require the use of
While not using
[weak self] in non-escaping closures does not cause reference cycles, it does cause delayed deallocation (which is not necessary a bad thing and can even be beneficial if one wants the code to finish executing before the object is killed). For example, a long operation inside of a closure can cause
self to stay in memory until the operation is completed.
One last thing to note is that using [weak self] with
guard let self = self (vs.
self?) can also, for the same reasons as above, cause a delayed deallocation.
And truly the last thing, using
[unowned self] is almost always a bad idea.
Want to learn more? Here is a great article.
Subscribe to The infinite monkey theorem
Get the latest posts delivered right to your inbox