defer 是 Swift 的一个关键字,用于延迟执行一段代码直到当前作用域结束时再执行。它的作用就是:“最后再做这件事”,不管是正常退出、return、还是抛出错误,它都会执行。
defer 的代码 一定会在当前作用域(函数、闭包、do块)退出时执行。
基本用法
func example() {
print("1")
defer {
print("This runs at the end!")
}
print("2")
}
输出结果:
1
2
This runs at the end!
用法示例
用法示例1:在多线程中释放锁
let lock = NSLock()
func updateData() {
lock.lock()
defer { lock.unlock() } // 确保无论如何都会释放锁
// 执行线程安全的代码
}
即使函数中间提前 return 或抛出异常,unlock() 都会运行。
用法示例2:清理资源
func readFile() throws {
let file = try FileHandle(forReadingAtPath: "data.txt")
defer {
file.closeFile() // 无论函数是否抛错,都会关闭文件
}
// 使用文件
}
特点
多个 defer,先进后出(LIFO)。
func test() {
defer { print("A") }
defer { print("B") }
defer { print("C") }
}
test()
输出顺序是:
C
B
A
使用场景
1、NSLock解锁:
lock.lock()
defer { lock.unlock() }
2、文件操作:
func readFile() throws {
let file = try FileHandle(forReadingAtPath: "data.txt")
defer {
file.closeFile() // 无论函数是否抛错,都会关闭文件
}
// 使用文件
}
3、数据库连接关闭:
defer { db.close() }
4、清理临时变量/文件:
defer { cleanup() }
总结
defer用于当前作用于退出时“自动执行”,多个defer是倒序执行。主要用于解锁、清理资源、关闭文件和清理缓存等场景。