簡體   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