/* defer代码块调用规则
*1、defer所在的func或scope必须执行到defer才会触发
*2、所在func或scope结束时执行时调用defer代码块
*3、多个defer时压栈,先进后出
*4、嵌套中的defer满足条件1、2、3
*5、continue 或者 break 都不会妨碍 defer 的执行
*6、defer代码块不一定总是最后执行,比如所在func或scope中有异步操作时(testFunc6),但总是在func或scope最后一行执行结束之后执行
*/
func testFunc() {
defer{
defer{
print("defer in")
}
print("defer1")
}
defer{
print("defer2")
}
print("end")
}
func testFunc1() {
do{
defer{
print("finally")
}
throwNSError()
print("impossible")
}catch{
print("handle error")
}
}
func testFunc2() {
letpath =""
letfileDescriptor = open(path, O_EVTONLY)
defer{
close(fileDescriptor)
}
// use fileDescriptor...
print("end")
}
func testFunc3() {
letvaluePointer = UnsafeMutablePointer.allocate(capacity:1)
defer{
valuePointer.deallocate()
}
// use pointer...
print("end")
}
func testFunc4() {
letlock = NSLock()
//同下面的.lock() .unlock()
// objc_sync_enter(lock)
// defer {
// objc_sync_exit(lock)
// }
lock.lock()
defer{ lock.unlock() }
// do something...
print("end")
}
functestFunc5(completion: () ->Void,str:String?) {
defer{
completion()
}
guard let _ = str else { return }
// handle success
print("end")
}
override func viewWillLayoutSubviews() {
defer{
super.viewWillLayoutSubviews()
}
//主要目的是在 super 方法之前做一些准备工作
// some preparation before super.viewWillLayoutSubviews()...
print("end")
}
func testFunc6() {
defer{
NSLog("defer")
}
letqueue = DispatchQueue.init(label:"uuuuuuuuuuu")
foriin0...2{
queue.async{
print("async\(i)")
}
}
print("end")
}