首页 > 解决方案 > 在 Swift 中对闭包的困惑强烈地捕获了其中使用的变量

问题描述

我有这个代码片段:

class Animal {
    var stamina = 0

    func increaseStamina() {
        stamina += 1
    }

    deinit {
      print("gone")
    }
}

var animal : Animal? = Animal()
let closure = {
  animal?.increaseStamina();
  print("closure end")
}
animal = nil //"gone"
closure()

在调用闭包之前将 animal 设置为 nil 后,它会立即打印“gone”。但我的理解是闭包也强烈地捕获了动物实例,所以实例应该在闭包执行之后被释放,而不是之前。我在这里的理解有什么问题?

标签: swift

解决方案


这是因为animal在调用闭包时捕获,而不是在声明时捕获。由于您在将 nil 设置为调用闭包animal,因此捕获的属性为 nil。


推荐阅读