使用 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 do
、try
、catch
块中。 defer
语句中的过程将始终在退出 do
、try
、catch
块的范围之前执行。通常这用于清理,例如关闭 IO。
do {
// will always execute before exiting scope
defer {
// some cleanup operation
}
// Try a operation that throws
let myVar = try someThrowableOperation()
} catch {
// error handling
}
如果您使用 fopen
、getline
访问 C API 并创建 CoreFoundation 对象、分配内存或读写文件,defer
非常适合使用。然后,您可以使用 dealloc
、free
、fclose
.
确保在所有情况下都正确清理
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
Swift 2.0 引入了一个新关键字:defer
这个关键字的正确使用方法是什么,需要注意什么?
由于swift使用ARC,内存管理通常是自动处理的。所以 defer 只需要在使用遗留低级/非弧调用的情况下调用内存管理,对吗?
其他情况包括文件访问,我想。在这些情况下,延迟将用于关闭 "file pointer"。
什么时候应该使用我在iOS/OSX开发的"real-world"(tm)中使用defer。以及什么时候使用它是个坏主意。
defer
关键字的正确使用是在 swift do
、try
、catch
块中。 defer
语句中的过程将始终在退出 do
、try
、catch
块的范围之前执行。通常这用于清理,例如关闭 IO。
do {
// will always execute before exiting scope
defer {
// some cleanup operation
}
// Try a operation that throws
let myVar = try someThrowableOperation()
} catch {
// error handling
}
fopen
、getline
访问 C API 并创建 CoreFoundation 对象、分配内存或读写文件,defer
非常适合使用。然后,您可以使用 dealloc
、free
、fclose
.
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