RxSwif中的self引用问题.md

处理 closure 中的 self

首先,如果 App 的 View Controller 会常驻在内存里,我们就根本无需担心这个问题,直接在 closure 中使用 self 就好,不用指定 unowned 或 weak。因为 Observables 的回收,是通过 DisposeBag 完成的,如果 View Controller 常驻在内存里,Observables 始终都不会回收,即便真的存在引用循环,也不会带来任何问题。

其次,在 Closure 和 View Controller 生命周期同步的时候,使用 unowned 捕获 self。也就是说 closure 代码执行完了,View Controller 也结束了。我们假设某个 UI 上有一个上传配置的按钮,点击同步完成后,自动退出这个界面。这种情况,按钮的事件处理 closure 中,我们就可以使用[unowned self],因为我们可以确信,当这段 closure 执行的时候,self 不可能是 nil;

最后,不属于之前两种情况的,都使用[weak self];

这样,我们就从另外一个角度,理解了捕获 self 问题。遵从这些原则,就可以有效地避免 RxSwift 相关的代码引起的内存泄漏或者意外崩溃问题。而解决了这个问题,我们才可以更安心地在项目中应用 RxSwift。

理解重复订阅 Observable 的行为

循环引用问题注意