2017-07-28 41 views
1

我在我的公司項目RxSwift中大量使用。在Instrument中執行性能測試時,真正令人擔憂的問題出現了。RxSwift`.addDisposableTo(disposeBag)`導致內存泄漏

每次.addDisposableTo(disposeBag)被調用時,Instruments都會顯示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 

    } 
} 

我做了一些研究,我有一個版本的儀器可能不明白RxSwift,使它看起來像有泄漏,但在現實中,沒有。 但是很可能我的實現有一些我不知道的問題,因爲我在RxSwift方面的經驗不多。 任何幫助表示讚賞。

回答

1

我會使用RxSwift資源調試功能得到第二個意見。您可以使用RxSwift.Resources.total變量調試內存泄漏,以確定問題是RxSwift,而不是儀器的誤報。

啓用調試模式,如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)") 
    }) 

,並多次使用你的觀測,看看資源的總數總是在結束同的過程。

最後,考慮到如果包含observable或dispose包的對象泄漏,問題是容器對象,而不是可觀察對象。由於Facebook SDK的問題,我正在泄漏視圖和控制器,並且在調試控制器內部使用的observables時發現問題:)。

我希望它有幫助, Xavi