誰がオブジェクトを「所有する」かという学術的な問題に関しては、これは単にstrong
そのオブジェクトへの参照を維持する人です。
アプリのリークを見つけるという点では、アプリをプロファイリングするときにInstrumentsの「リーク」ツールを使用できます(Xcodeの「製品」メニューで「プロファイル」を選択します)。
ただし、「リーク」に表示されない場合は、それが強力な参照サイクル(以前は保持サイクルと呼ばれていました)であるか、単純な論理エラー(View Controllerでの循環参照、キャッシングなど)であるかを判断する必要があるようです。大きなオブジェクトなど)またはCore Foundation関連の問題(CFBridgingRelease()
またはの使用に注意しない限り、ARCは所有権を引き継ぎません__bridge_transfer
)。
Instrumentsを使用して割り当てのソースを見つけるという点で、私が最も役立つ2つのトリックは次のとおりです。
- マウスでドラッグして(6より前のXcodeバージョンでは、optionこれを行う間はキーを押したままにする必要があります)、タイムラインの一部を強調表示して、検査する対象を識別します。おそらく、割り当ての急増の1つに焦点を当てたいと思うでしょう。たとえば、割り当てにバンプが見つかり、そのように強調表示しました(これは、で巨大な配列を作成するというばかげた単純な例でした
viewDidLoad
が、うまくいけば、アイデアが得られます)。
- 呼び出しツリーで検査する場合、コードに焦点を合わせるために「システムライブラリを非表示にする」を選択すると便利なことがよくあります。そして、Instrumentsでメソッド名をダブルクリックすると(私の例では、ここではそうなります
viewDidLoad
)、Instrumentsは割り当てを行っているコードを表示します。
次に、関連するメソッドリストをダブルクリックすると、割り当てを行ったコードに正確に移動します。
これはリークが発生したことを示していませんが(つまり、強い参照サイクルまたはリリースに失敗した場所)、この種の分析は、リークされたオブジェクトがインスタンス化された場所を追跡するのに役立つことがよくあります。これは最初の問題を追跡するためのステップ。
誰がオブジェクトを「所有」しているのか(つまり、オブジェクトの強力な参照(または保持)が発生した場所)を本当に把握する必要がある場合、Xcode8には新しいオブジェクトグラフ機能があります。そのため、アプリをデバッグしてから、デバッグバーの[メモリグラフのデバッグ]アイコン(下の赤い丸で囲んだ部分)をタップします。これを行うと、左側のオブジェクトを選択でき、オブジェクトの所有権の主張を示すオブジェクトグラフが表示されます。
上記は、選択された画像がUIImageView
提示されている画像の両方から強い参照を持っていることを示していますが、ViewControllerも強い参照を維持しています。
以前のXcodeバージョンでは、アプリをプロファイリングしてInstrumentsで実行し、[参照カウントの記録]オプションを選択します。Xcode 6では、これは右端のパネルの[レコード設定]タブにあります。
Xcode 5以前では、この「参照カウントの記録」オプションを表示するには、割り当てツールの横にある情報ボタンをクリックする必要があります。
とにかく、次に割り当ての概要に移動し、解放されなかったオブジェクトにドリルダウンします(割り当てツールでオブジェクトを表示しているときにオブジェクトアドレスの横にある右矢印をクリックして)。次に、上記のように、問題のオブジェクトの保持と解放のリスト。ただし、これは、アプリのプロファイリングの前に[参照カウントの記録]を選択した場合にのみキャプチャされます。
この方法で保持カウントを追跡することに慣れるにはしばらく時間がかかりますが、強力な参照が確立された場所をどうしても知る必要がある場合は、[参照カウントを記録する]オプションが役立ちます。