RxSwiftでオブジェクト数を確認する

RxSwiftを使って実装する際にObservableが残り続けてしまってメモリーリークにつながってるのではないか心配になることがあるかと思います。
そのために簡単にRxSwiftで現状使われてるオブジェクト数を確認するためのプロパティが用意されているのでそれを紹介します。

準備

結論から言ってしまうと、
RxSwift.Resources.total
と書くことで現状のオブジェクト数を確認することができますが、下準備が必要です。

というのもこのtotalの定義を辿ってみると、

というようになっていて、RxSwiftがTRACE_RESOURCESのフラグを付けたビルドバージョンでなければ使えないので注意です。
特にswift3からこのような仕様になっているので注意が必要です。以前までのバージョンだとRxSwift.resourceCountとなっています。

CocoaPodsでインストールする際に、

このようにつけることによって、TRACE_RESOURCESのフラグをDebugビルドのときのみにつけることができます。
Carthageでのやりかたは今回は特に調べてないですが、要はTRACE_RESOURCESのフラグをつけれれば大丈夫です。

補足ですが、swift3で導入する際にはReadmeにrxswift-3.0ブランチでって書いてありますが、CocoaPodsでブランチ指定でインストールする場合は上記のように書きます。

先程のようにPodfileを書き換えてpod installすれば、
RxSwift.Resources.total
が使えるようになったかと思います。
totalの数なので大まかにしか確認することができませんが、極端に増えていないかどうかを確認することができます。
totalに含まれる対象ですが、ソースコードのコメントに
Counts internal Rx resource allocations (Observables, Observers, Disposables, etc.).
というように記述があります。
印象としてはRxCocoaを使っている場合にUI関連のものはObservableをプロパティとして持つのでそれもカウントされている印象でした。

リリースビルドで使えないので注意

RxSwift.Resources.totalを単発で使う場合は大丈夫ですが、もし残しておく場合に、先程から言っているようにDebugビルドのときのみフラグを有効にしているのでリリースビルドの際にエラーが出るかと思います。
対処法としては、TRACE_RESOURCESをリリースビルドでも有効にすることでも解決できますが、

というように囲むようにしましょう。
この書き方を使えるようにするには、「BuildSettings」→「OtherSwiftFlags」にこのように「-D DEBUG」をつけるようにしましょう。

これで完了です。
細かいデバッグはできませんが大まかな確認にはなると思うので参考にしていただければ嬉しいです。

SNSでもご購読できます。

コメントを残す

*