swift学习--闭包的循环引用解决

本文介绍了循环引用的概念及其在Swift中的发生原因,并提供了三种解决Swift闭包导致循环引用问题的有效方法:使用weak变量、使用unowned变量以及推荐的闭包语法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、什么是循环引用、怎么发生的

     循环引用就是当self 拥有一个block的时候,在block 又调用self的方法。形成你中有我,我中有你,谁都无法将谁释放的困局。

    在oc中,通常解决block循环引用的办法就是weak来修饰self!

    __weak typeof self (weakself) = self

    swift中的闭包等于OC中的block,因此在使用闭包的时候也需要注意循环引用的问题

二、解决swift中闭包循环引用问题

  1.类似block解决办法

        weak var weakSelf = self
        //解决循环引用 ,这里用var 而不用let
        //因为weak可能在运行时被修改 ——》指向的对象一旦被释放,会被设为nil
        GCDText { (data) in

            //? 可选解包 , 对象为nil,不会向对象发送getter消息,更安全
            //! 强行解包 ,如果对象为nil 会发生崩溃,一般用于对象接下来要进行计算
            print(weakSelf?.view ??  UIView())
            
        }

2.swift解决方法,推荐使用

        GCDText {[weak self] (data) in
            
            print(self?.view ?? UIView())
        }

3.unowned;

        GCDText { [unowned self](data) in
         
        }


unowned

   

    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值