SWIFT コードで強い参照サイクルを見つけるためのツールまたは方法はありますか?
強い参照サイクルとは、クラスの 2 つのインスタンスが適切な安全性 ( weak
/ unowned
) なしで相互に参照する場合です。そのため、作成したすべての変数がそれらのオブジェクトの参照を停止すると、ガベージ コレクターがそれらを破棄できなくなります。
SWIFT コードで強い参照サイクルを見つけるためのツールまたは方法はありますか?
強い参照サイクルとは、クラスの 2 つのインスタンスが適切な安全性 ( weak
/ unowned
) なしで相互に参照する場合です。そのため、作成したすべての変数がそれらのオブジェクトの参照を停止すると、ガベージ コレクターがそれらを破棄できなくなります。
計測器を使用して、リークや記憶喪失をチェックします。インストルメントの割り当てインストゥルメントでマーク生成 (ヒープショット) を使用します。
Heapshot を使用してメモリ クリープを検出する方法については、bbum ブログを参照してください。
基本的な方法は、Instruments 割り当てツールを実行し、ヒープショットを取得し、コードの反復を実行して、別のヒープショットを 3 ~ 4 回繰り返すことです。これは、反復中に割り当てられ、解放されないメモリを示します。
結果を把握するには、個々の割り当てを確認してください。
オブジェクトの保持、解放、および自動解放が発生する場所を確認する必要がある場合は、インストゥルメントを使用します。
計測器で実行し、割り当てで「参照カウントの記録」をオンに設定します (Xcode 5 以前では、オプションを設定するには記録を停止する必要があります)。アプリを実行し、記録を停止し、ドリルダウンすると、すべての保持、解放、および自動解放が発生した場所を確認できます。
非常に簡単なアプローチは、プリントを deinitializer に入れることです
deinit {
print("<yourviewcontroller> destroyed.")
}
この行がコンソールに表示されていることを確認してください。すべてのビューコントローラーにdeinitを入れてください。特定のビューコントローラーを確認できなかった場合は、それらが参照サイクルであることを意味します。考えられる原因は、デリゲートが強い、クロージャーが自己をキャプチャする、タイマーが無効でないなどです。
そのためにInstrumentsを使用できます。この記事の最後の段落で次のように述べています。
Instruments が開いたら、アプリケーションを起動し、特にテストしたい領域またはビュー コントローラーでいくつかの操作を行う必要があります。検出されたリークは、「リーク」セクションに赤い線で表示されます。アシスタント ビューには、Instruments がリークに関連するスタック トレースを表示する領域が含まれており、問題がどこにある可能性があるかについての洞察が得られ、問題のあるコードに直接移動することさえできます。