Ios 闭包如何删除视图控制器的内存?

Ios 闭包如何删除视图控制器的内存?,ios,swift,Ios,Swift,我想了解一下闭包中的内存管理 例如,我们有一个视图控制器,它要完成一个闭包。当我检查视图控制器的引用计数时,它显示引用计数1 何时清除/删除已关闭视图控制器的内存 这是我的密码 class ViewController: UIViewController { @IBOutlet weak var buttonToHide: UIButton! override func viewDidLoad() { super.viewDidLoad() /

我想了解一下闭包中的内存管理

例如,我们有一个视图控制器,它要完成一个闭包。当我检查视图控制器的引用计数时,它显示引用计数1

何时清除/删除已关闭视图控制器的内存

这是我的密码

class ViewController: UIViewController {

    @IBOutlet weak var buttonToHide: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    @IBAction func showSecondViewController()  {
        guard let second  = self.storyboard?.instantiateViewController(withIdentifier: "second") else { return  }
        present(second, animated: true, completion: nil)
    }

}



class SecondViewControler: UIViewController {

    @IBOutlet weak var lbl:  UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    }

    deinit {
        print("\(self) is being deinitialized") // still self object is there
        print(_getRetainCount(self)) // returning 1
    }

    @IBAction func dismissController()  {
        DispatchQueue.main.asyncAfter(deadline: .now() +  .seconds(6)) {
            self.lbl.text = "HHi"
            print("self reference : ",self.lbl.description)
        }
        self.dismiss(animated: true, completion: nil)
    }

    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("viewDidDisappear", self.lbl.description)
    }

}
根据实例,在调用其deinitializer之后的一段时间内,不会立即解除分配它的引用计数1

Deinitializer是在实例之前自动调用的 解除分配发生。您不允许呼叫取消初始化器 你自己超类去初始化器由其子类继承, 并且超类deinitializer在 子类去初始化器实现。超类去初始化器是 始终调用,即使子类不提供自己的 去初始化器

因为一个实例在其deinitializer之后才被释放 调用时,反初始化器可以访问实例的所有属性 它被调用,并且可以基于这些属性修改其行为 (例如查找需要关闭的文件名)

根据实例,在调用其deinitializer之后的一段时间内,不会立即解除分配它的引用计数1

Deinitializer是在实例之前自动调用的 解除分配发生。您不允许呼叫取消初始化器 你自己超类去初始化器由其子类继承, 并且超类deinitializer在 子类去初始化器实现。超类去初始化器是 始终调用,即使子类不提供自己的 去初始化器

因为一个实例在其deinitializer之后才被释放 调用时,反初始化器可以访问实例的所有属性 它被调用,并且可以基于这些属性修改其行为 (例如查找需要关闭的文件名)


请参考以下和标题“关于闭包的强参考周期”,您将非常了解它的工作原理。我认为引用计数将是1,除非
deinit
方法完成。因此,在完全关闭后检查引用计数。请参考以下和标题“关闭的强引用周期”,您将对其工作原理有很好的了解。我认为引用计数将是1,除非
deinit
方法完成。因此,请在完全解除后检查引用计数。