您的当前位置:首页正文

RxSwift循环引用问题

来源:图艺博知识网
[weak self] 和 [unowned self]的区别
弱引用(weak)、或者无主引用(unowned)

示例代码
textField.rx.text.orEmpty.asDriver().drive(onNext: {
            [weak self] text in //  [unowned self] text in
            DispatchQueue.main.asyncAfter(deadline: .now() + 4) {
                print("当前输入内容:\(String(describing: text))")
                self?.label.text = text
            }
        }).disposed(by: disposeBag)

当block做延时操作,控制器pop后,self内存被回收,unowned会导致崩溃
当OC中何时用weakSelf、何时用strongSelf的就是针对这个场景,当block在self被销毁后还有数据需要计算,这时必须考虑到用strongSelf。

使用场景
当self可能在还未执行block前被销毁,就要将捕获定义为 weak。操作nil对象不会崩溃。
如果它们一直是相互引用,即同时销毁的,那么就可以将捕获定义为 unowned。
只有能够确保修饰的对象(self)不会先于当前block对象释放时,才可以使用unowned关键字。
Top