Swift:了解一下 defer

May 23, 2021 • 预计阅读时间 1 分钟

关于 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 块的执行,只和其所在的作用域有关。
swift
版权声明:如果转发请带上本文链接和注明来源。

lvv.me

iOS/macOS Developer

clang 跨平台编译 iOS/macOS arm64/x86_64