解析Swift中闭包的循环引用

2 篇文章 0 订阅
1 篇文章 0 订阅

解析Swift中闭包的循环引用

1.什么时候会发生循环引用

原理跟OC中的block类似, 当有个属性记录下了函数传递回来的闭包, 产生强引用, 就会发生闭包的循环引用

2.怎么解决循环引用

如何解决闭包的循环引用, 同样有三种方式:

  • 使用weak修饰变量, 打破强引用, 因为使用weak修饰的变量有一次变成nil的机会

  • 使用[weak self] 修饰闭包原理跟__weak类似, 这样在闭包中使用self, 就是弱引用

  • 使用[unowned self ] 修饰闭包, 跟__unsafe_unretained类似, 不安全

3.如何判断是否发生强引用, 闭包中使用析构函数

  • 代码:
//swift dealloc

//析构函数

deinit{

print("销毁")

}
  • storyboard:

748058-d28cabf10ff73b50.png

4.Swift中的代码

import UIKit

class ViewController: UIViewController {
    var finishedCallBack: ( (dataString: String) -> () )?
    override func viewDidLoad() {
        super.viewDidLoad()

//解决方式三: [unowned self]  跟 _unsafe_unretained 类似  不推荐使用 
        loadData { [unowned self] (dataString) -> () in
            print("\(dataString) \(self.view)")
        }  
    }

    func method2() {
        //解决方式二:  在swift中 有特殊的写法 ,跟OC __weak 相似  [weak self]
        loadData { [weak self] (dataString) -> () in

            //以后在闭包中中 使用self 都是若引用的
            print("\(dataString) \(self?.view)")
        }
    }

    func method1() {
        // 解决方式一: weak
        weak var weakSelf = self
        loadData { (dataString) -> () in
            print("\(dataString) \(weakSelf?.view)")
        }
    }


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

        // 记录闭包
        self.finishedCallBack = finished
        //加载数据
        dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in

            print("执行耗时操作")

            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                //执行回调
                self.working()
            })
        }
    }


    func working() {
        self.finishedCallBack?(dataString: "<html>")
    }

    //swift dealloc
    //析构函数
    deinit {
        print("销毁")
    }
}

    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值