可能な限り Swift 構造体を使用しようとしています。また、クロージャーを取るメソッドを持つ RxSwift も使用しています。selfを参照するクロージャーを作成する構造体がある場合、それは強い参照サイクルを作成します。
import Foundation
import RxSwift
struct DoesItLeak {
var someState: String = "initial value"
var someVariable: Variable<String> = Variable("some stuff")
let bag = DisposeBag()
mutating func someFoo() {
someVariable.subscribeNext { person in
self.someState = "something"
}
.addDisposableTo(bag)
}
}
どうすればこれを知ることができますか? 100,000 の DoesItLeak オブジェクトを作成し、それぞれで someFoo() を呼び出した場合、100,000 のオブジェクトが強い参照サイクルを持つと考えられます。つまり、これらのオブジェクトを含む DoesItLeak 配列を削除しても、オブジェクトはメモリに残ります。someFoo() を呼び出さなければ問題ありません。
変数はクラスです。したがって、xcode の Instruments の割り当てを使用し、Variable< String >でフィルタリングすることで、このメモリの問題を確認できます。
次のように [weak self] を使用しようとすると、コンパイル エラーが発生します。
someVariable.subscribeNext { [weak self] person in
コンパイラエラーは「クラス以外の型にweakを適用することはできません」です
実際の/非サンプル コードでは、self を介してメソッドと変数にアクセスしますが、これはメモリの問題です。
DoesItLeak を構造体のままにして、このメモリの問題を解決するにはどうすればよいですか?
ご協力いただきありがとうございます。