关于 defer
的几条说明:
defer
会在退出其作用域的时候执行。- 同一个作用域内可以定义多个
defer
。 defer
不要定义在作用域的末尾(因为没有必要)。
一个例子解释:
func loadFile(atPath path: String) {
let fs = InputStream(fileAtPath: path)
defer { // loadFile 方法返回前执行
fs.close()
}
fs.open()
...
for i in 0..<9 {
let lock = NSLock()
defer { // 每一次循环结束前执行
lock.unlock()
}
}
...
defer { // 可以定义多个 defer 块
}
...
}
以上例子可以充分理解了 defer
的使用场景。
可能遇到的误区:
func foo() {
if x { // 本意是根据条件判断是否执行 defer
defer { // 超出 if 作用域就会执行
....
}
}
}
正确的做法:
func foo() {
defer {
if x { // 根据条件判断是否执行 defer
...
}
}
}
总结:
- 多个
defer
块可以同时存在。 defer
块的执行,只和其所在的作用域有关。