Swift之循环引用

Swift中的循环引用是怎么样的呢?我们来看看:

 func loadData(completion:@escaping ()->()) -> () {
   
    //异步
    DispatchQueue.global().async { 
        print("耗时操作")
        
        DispatchQueue.main.async {
           //回调,执行闭包
            completion()
        }
    }
}

//类似于oc的dealloc
deinit {
    print("我去了")
}

调用:

loadData {
        print(self.view)
    }

这样是不会引起循环引用的,为什么呢?

//block中如果出现self.要特别小心
//循环引用单方向对引用是不会产生循环引用
//只是闭包对self.进行了copy,闭包执行完成之后,会自动销毁,同时释放对self引用

要循环引用还要self对闭包引用:
所以循环引用是下面这样的:

func loadData(completion:@escaping ()->()) -> () {
   
    //使用属性记录闭包 -> self对闭包引用了
    completionCallBack = completion
    
    //异步
    DispatchQueue.global().async { 
        print("耗时操作")
        Thread.sleep(forTimeInterval: 2.0)
        
        DispatchQueue.main.async {
           //回调,执行闭包
            completion()
        }
    }
}

//类似于oc的dealloc
deinit {
    print("我去了")
}

调用:

class ViewController: UIViewController {
//属性就是一个var
var completionCallBack: (()->())?


override func viewDidLoad() {
    super.viewDidLoad()
   
         print(self.view)
    }

这样就形成了循环引用,我们可以在sb中加个nav测试一下,deinit就不会打印。
循环引用就是一个环, 我引用你,你引用我,所以就会形成循环引用,要解除循环引用,就需要打断链条,有三种方法,第一种是用OC的方式如下:

//方法一:用OC的方式
    //细节一 var weak只能修饰var 不能修饰let
    //'weak' must be a mutable variable, because it may change at runtime
    //weak可能会被在运行时被修改 -> 指向的对象被释放会被自动设置为nil
    weak var weakSelf = self;
    loadData {
        //细节二 
        //解包有两种方式解包
        //? 可选解包 -如果self已经被释放,不会向对象发送getter的消息,更加安全
        //!强行解包 -如果self已经被释放,强行解包会导致崩溃
        
        /**
         weakSelf?.view  只是单纯的发送消息,没有计算
         强行解包 因为需要计算 可选项不能直接参与到计算
        */
        print(weakSelf?.view as Any)

    }

方法二,使用swift推荐的方法:

//方法二:swfit的推荐方法
    //[weak self]表示{}中的所有self都是弱引用,需要注意解包
    loadData { [weak self] in
        print(self?.view as Any)
    }

方法三:

//方法三:swfit的另外一个方法 知道就好
    //[unowned self]表示{}中的所有slef都是assign的,不会强引用,但是。如果释放,指针地址不会变化
    //如果对象被释放,继续调用就会出现野指针的问题
    loadData { [unowned self] in
        print(self.view as Any)
    }

循环引用的解决办法推荐使用第一种和第二种方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,194评论 4 61
  • 今年3月5日,是时代呼唤学习雷锋的第53个纪念日。 雷锋精神是中华民族传统美德的一种积淀,是一种随着时代进步而不断...
    张新甫zxf229054阅读 3,690评论 3 3
  • 9月20日晚上9点21分,我在写公司的某份方案文件,突然手机发出了来电震动提示音,来电的是爸爸。右手调动鼠标点击保...
    筱未的糖果罐儿阅读 3,101评论 0 0
  • 这是一个沉重的话题。英国金融时报的记者在上海的弄堂里发现了一个弃婴。在故事关于弃婴的部分里,弃婴患有包括先天性心脏...
    树上的伯爵阅读 825评论 0 0
  • 1.前言## 去年年底的时候iOS逆向工程开始大火,可那个时候鄙人正在研究facebook出品的React-Nat...
    倚楼听风雨wing阅读 4,145评论 1 3