2017-07-28 8 views
1

私はRxSwiftという会社のプロジェクトで頻繁に使用しています。そしてインストゥルメントでパフォーマンステストを実行すると、本当に心配な問題が発生しました。RxSwift `.addDisposableTo(disposeBag)`はメモリリークの原因となる

.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 

    } 
} 

私はいくつかの研究を行ってきたと私はインストゥルメントはRxSwiftを理解し、漏れがありますが、実際には、存在しないようにそれが見えるようにしない場合があります1つのバージョンを持っています。 しかし私の実装には、RxSwiftでの経験がほとんどないのでわからないという問題があります。 助けていただければ幸いです。

答えて

1

私はRxSwiftリソースのデバッグ機能を使用して2番目の意見を得るでしょう。 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)") 
    }) 

とリソースの合計数は末尾に常に同じであるかどうかを確認するために数回、あなたの観測を使用しますプロセスの

最後に、observableまたはdisposeバッグを含むオブジェクトがリークした場合、問題はコンテナオブジェクトであり、オブザーバブルではないことに注意してください。私は、Facebook SDKの問題のためにビューとコントローラを漏らしていました。コントローラ内で使用されているobservablesをデバッグするときに問題が見つかりました。

私はそれが役に立ちそうですが、 Xavi

関連する問題