Swift 闭包循环引用安全

在OC的Block 中

  • 1. __block 修饰的变量 是 地址传递 也就是 & 传递过去,其引用计数器不会增加
  • 2. __weak 在ARC 情况下使用 MRC情况下使用 __unsafe_unretained , 一般用于 block 作为参数传入的时候,需要引用了外部的对象 如 self 是经常使用的
            //添加点击事件
            //创建出一个self 对象 不增加引用计数器
            __weak typeof(self) weakSelf = self;
    
            [button addClickedTouchUp:^(UIButton *sender) {
                [weakSelf switchKeyDoSomething:sender];
            }];
    

在Swift的闭包 (Closure)中

  • 1.使用 Lazy 或者 熟悉闭包的时候可以 [weak self] in
        lazy var btn:UIButton = {
            [weak self] in
            let btn = UIButton()
            // weak 表示 self 在这个方法运行的时候,可能会消失,也就是self 被释放内存,所以是一个可选类型
            // 如果确认 self 不会消失,就可以使用 [unowned self] in
            if let strongSelf = self{
                strongSelf.view.addSubview(btn)
            }
            return btn
        }()
  • 2. 在回调有参数的情况下
        // 下拉刷新
        tableView.addHeaderPullCallback{
                [weak self] (Void) -> () in
    
                if let strongSelf = self {
                    strongSelf.downLoadData()
                }
    
        }
        // 可以使用多标注[weak self, unowned ...]
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值