使用 Swift 的 defer 的正确方法是什么

What's the proper way of using Swift's defer

Swift 2.0 引入了一个新关键字:defer

这个关键字的正确使用方法是什么,需要注意什么?

由于swift使用ARC,内存管理通常是自动处理的。所以 defer 只需要在使用遗留低级/非弧调用的情况下调用内存管理,对吗?

其他情况包括文件访问,我想。在这些情况下,延迟将用于关闭 "file pointer"。

什么时候应该使用我在iOS/OSX开发的"real-world"(tm)中使用defer。以及什么时候使用它是个坏主意。

defer 关键字的正确使用是在 swift dotrycatch 块中。 defer 语句中的过程将始终在退出 dotrycatch 块的范围之前执行。通常这用于清理,例如关闭 IO。

do {

    // will always execute before exiting scope
    defer {
        // some cleanup operation
    }

    // Try a operation that throws
    let myVar = try someThrowableOperation()

} catch {
    // error handling
}
如果您使用 fopengetline 访问 C API 并创建 CoreFoundation 对象、分配内存或读写文件,

defer 非常适合使用。然后,您可以使用 deallocfreefclose.

确保在所有情况下都正确清理
let buffSize: Int = 1024
var buf = UnsafeMutablePointer<Int8>.alloc(buffSize)
var file = fopen ("file.txt", "w+")
defer {
  buf.dealloc(buffSize)
  fclose(file)
}
// read and write to file and and buffer down here