swift中解决闭包循环引用的几种方式

import UIKit


class ViewController: UIViewController {


    

    // VC --strong -- 闭包

    // 闭包- strong -- VC

    //定义属性闭包

    //swift 属性的默认 就是强引用

    var finishedCallback: ((res: String) -> ())?

    

    override func viewDidLoad() {

        super.viewDidLoad()

        

        loadData { [unowned self] (result) in

            print(result,self)

        }

    }

    

    // [unowned self] __unsafe__retained作用类似  -> 对象被回收是 内存地址不会自动指向nil 会造成野指针访问

    

    func methodInSwift2() {


        loadData { [unowned self] (result) in

            print(result,self)

        }

    }

    

    //[weak self] __weak typeof(self) 作用类似  -> 对象被回收是 内存地址会自动指向nil  更加安全 推荐使用这种方式

    func methodInSwift1() {

        loadData { [weak self] (result) in

            print(result,self)

        }

    }

    


    func methodInOC() {

        //1. 仿照OC 解决

        //弱引用的对象 又一次执行 nil的机会

        weak var weakSelf = self

        loadData { (result) in

            print(result,weakSelf)

        }

    }

    

    func loadData(finished: (result: String) -> () ) {

        

        finishedCallback = finished

        dispatch_async(dispatch_get_global_queue(0, 0)) { 

            NSThread.sleepForTimeInterval(3)

            

            //在主队列回调

            dispatch_async(dispatch_get_main_queue(), { 

                //执行闭包

                finished(result: "办证: 13581850000")

                

            })

        }

    }


    //dealloc OC

    //析构函数

    deinit {

        print("886")

    }


}

你可能感兴趣的:(其他)