I have a controller class that owns a Bluetooth manager object and gives it a completion closure that updates the controller's state. After the screen is closed, the controller's deinit is never called and memory grows each time the screen is opened.
I have seen [weak self] and [unowned self] added to closures, sometimes everywhere. How does the cycle actually form, which closures need a capture list, and how do I prove the leak is fixed?




