私は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での経験がほとんどないのでわからないという問題があります。 助けていただければ幸いです。