Problem Statement
Why do we often use `[weak self]` inside closures in Swift classes?
Explanation
When you capture `self` strongly in a closure that the instance holds (for example a callback), you can create a retain cycle: the instance holds the closure, the closure holds `self`. Using `[weak self]` breaks the strong cycle by capturing `self` weakly so it can be deallocated when no longer used. This is a key memory-management technique in Swift.