繁体   English   中英

RxSwift`.addDisposableTo(disposeBag)`导致内存泄漏

[英]RxSwift `.addDisposableTo(disposeBag)` causes memory leak

我在我的公司项目RxSwift中大量使用。 当在Instrument中运行性能测试时,确实出现了令人担忧的问题。

每次.addDisposableTo(disposeBag)时,仪器都会显示大约10个字节的内存泄漏。 没有特定的发生原因的模式,例如没有在正确的地方使用[weak self] ,只是没有明显的原因而发生。

一些示例代码:

class ContactsViewModel: NSObject {
    fileprivate let disposeBag = DisposeBag()
    fileprivate let provider = AuthorizedNetworking().provider

    var contacts: Variable<[User]> = Variable([])
    var suggestedContacts: Variable<[User]> = Variable([])

    func fetchContact(suggestions: Bool = false) {
        ActivityIndicator.showLoadingHUD(message: "Fetching contacts...")
        let observable = provider.request(suggestions ?
            .suggest :
            .searchContacts(query: nil, global: false)).filterSuccessfulStatusCodes()
        let mapped = observable.checkForErrors().mapObject(DataListResponse<User>.self)
        mapped.subscribe { [weak self] event in
            switch event {
            case let .next(response):
                ActivityIndicator.hideLoadingHUD()
                if response.success, let contacts = response.data {
                    if suggestions {
                        self?.suggestedContacts.value = contacts
                    } else {
                        self?.contacts.value = contacts.filter { $0.contactType == "Friend" }
                    }
                } else {
                    Log(.Network, .Error, "Unable to retrieve current user")
                }
            case let .error(error):
                ActivityIndicator.hideLoadingHUD()
                Log(.Network, .Error, error.localizedDescription)
            default:
                break
            }
            }.addDisposableTo(disposeBag) <- Instruments show leak [6 bytes] at this line

    }
}

我已经做过一些研究,并且我有一个版本,Instrument可能不理解RxSwift并使它看起来好像有泄漏,但实际上没有泄漏。 但是由于我对RxSwift的经验很少,所以我的实现很可能会遇到未知的问题。 任何帮助表示赞赏。

我将使用RxSwift资源调试功能获得第二意见。 您可以使用RxSwift.Resources.total变量调试内存泄漏,以确保问题是RxSwift而不是对Instruments的误判。

如RxSwift问题#378中所述 ,启用调试模式,将此代码添加到您的应用程序委托中:

/* add somewhere in
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil)
*/
_ = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
    .subscribe(onNext: { _ in
        print("Resource count \(RxSwift.Resources.total)")
    })

并使用您的可观察值的几次,以查看该过程结束时资源总数是否始终相同。

最后,考虑到如果包含可观察物或处理袋的对象泄漏,则问题出在容器对象而不是可观察物。 由于Facebook SDK出现问题,我泄漏了视图和控制器,并且在调试控制器内部使用的可观察对象时发现了问题:)。

希望对您有帮助,Xavi

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM