Swift 循环引用

1. 异步操作

  //闭包应用场景: 异步操作完成之后,通过闭包的参数传递网络请求结果
  func loadData(finished: @escaping (_ html:String)->()){
        //1.记录完成回调
        finishedCallBack = finished;
        DispatchQueue.global().async {
            print("模拟异步加载 \(Thread.current)")
            Thread.sleep(forTimeInterval: 5)
            //主线程回调
            DispatchQueue.main.async {
                print("主线程回调 \(Thread.current)")
                //如果回调不能在当前方法立即执行,可以通过属性记录,在需要的时候执行
                //finished(" ")
                self.finishedCallBack?(" ")
                
            }
        }
    }

2. 定义完成回调属性与类释放之前调用函数

    //定义完成回调属性
    //闭包的返回值可选
    //var finishedCallBack: ()->()?
    //闭包属性可选
    var finishedCallBack: ((_ html: String)->())?

    //销毁前调用的函数
    deinit {
        print("ViewController deinit")
    }

3. 解除循环三种方法

  3.1 方法一:OC 的传统方式

   func demo(){
        //weak 属性在运行时可能会被改变 --> 执行对象一旦被释放,变成 nil
        //weak 属性不能实是 let
        weak var weakSelf = self
        
        loadData { html in
            print(html)
            //闭包中,一定要使用 self
            //定义闭包的时候,会对 self 进行 copy 强引用
            //self 属性默认就是强引用
            //weakSelf? 表示对象一旦被释放,不再访问其属性或者方法
            print(weakSelf?.view)
       }

  3.2 方法二:Swift 的方法 1

 func demo1(){
        //[weak self] 表示闭包中的 self 都是弱引用
        //与 __weak 类似,如果 self 被释放,什么都不做,更安全
        loadData {[weak self] html in
            print(html)
            //self? 表示对象一旦被释放,不再访问其属性或者方法
            print(self?.view)
        }
    }

  3.3 方法三:Swift 的方法 2

 func demo2(){
        //[unowned self] 表示闭包中的 self 都是 assign -> 如果 self 被释放,闭包中的 self 的地址不会修改
        //与 __unsafe_unretained 类似,如果 self 被释放,(同样会出现野指针??)
        loadData {[unowned self] html in
            
            print(html)
            //self? 表示对象一旦被释放,不再访问其属性或者方法
            print(self.view)
        }
    }

你可能感兴趣的:(Swift,Sina,iOS,Swift)