swift-defer

/* 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")

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。