14

ARCを使用するアプリを作成していますが、現時点でメモリリークが発生しているようです。グーグルインスペクターの使い方に関するヒントをいくつか見つけました。そこでは、いくつかのクラスのインスタンスの割り当てのヒープを確認できます。また、オブジェクトがどのように割り当てられ、保持カウントがどのように変更されたかについての呼び出しスタックも確認できます。

しかし、完全な呼び出しスタックを見ることができないように思われるので、最終的に誰がオブジェクトを所有しているかわかりません。この所有者はどういうわけかオブジェクト(または疑わしいオブジェクトを所有しているオブジェクト)を解放していないように見えます。

割り当てられたオブジェクトの所有者を見つけるためのヒントを誰かに教えてもらえますか?

また、オブジェクトは「リーク」としてマークされておらず、割り当て済みとしてマークされていることにも注意してください。着実に新しいオブジェクトが割り当てられているため、オブジェクトがリークしているように見えます。

最善の方法でリークの疑いを見つける方法についてさらにサポートをいただければ幸いです。

4

1 に答える 1

51
  1. 誰がオブジェクトを「所有する」かという学術的な問題に関しては、これは単にstrongそのオブジェクトへの参照を維持する人です。

  2. アプリのリークを見つけるという点では、アプリをプロファイリングするときにInstrumentsの「リーク」ツールを使用できます(Xcodeの「製品」メニューで「プロファイル」を選択します)。

  3. ただし、「リーク」に表示されない場合は、それが強力な参照サイクル(以前は保持サイクルと呼ばれていました)であるか、単純な論理エラー(View Controllerでの循環参照、キャッシングなど)であるかを判断する必要があるようです。大きなオブジェクトなど)またはCore Foundation関連の問題(CFBridgingRelease()またはの使用に注意しない限り、ARCは所有権を引き継ぎません__bridge_transfer)。

  4. Instrumentsを使用して割り当てのソースを見つけるという点で、私が最も役立つ2つのトリックは次のとおりです。

    • マウスでドラッグして(6より前のXcodeバージョンでは、optionこれを行う間はキーを押したままにする必要があります)、タイムラインの一部を強調表示して、検査する対象を識別します。おそらく、割り当ての急増の1つに焦点を当てたいと思うでしょう。たとえば、割り当てにバンプが見つかり、そのように強調表示しました(これは、で巨大な配列を作成するというばかげた単純な例でしたviewDidLoadが、うまくいけば、アイデアが得られます)。

    ここに画像の説明を入力してください

    • 呼び出しツリーで検査する場合、コードに焦点を合わせるために「システムライブラリを非表示にする」を選択すると便利なことがよくあります。そして、Instrumentsでメソッド名をダブルクリックすると(私の例では、ここではそうなりますviewDidLoad)、Instrumentsは割り当てを行っているコードを表示します。

    ここに画像の説明を入力してください

    次に、関連するメソッドリストをダブルクリックすると、割り当てを行ったコードに正確に移動します。

    ここに画像の説明を入力してください

これはリークが発生したことを示していませんが(つまり、強い参照サイクルまたはリリースに失敗した場所)、この種の分析は、リークされたオブジェクトがインスタンス化された場所を追跡するのに役立つことがよくあります。これは最初の問題を追跡するためのステップ。


誰がオブジェクトを「所有」しているのか(つまり、オブジェクトの強力な参照(または保持)が発生した場所)を本当に把握する必要がある場合、Xcode8には新しいオブジェクトグラフ機能があります。そのため、アプリをデバッグしてから、デバッグバーの[メモリグラフのデバッグ]アイコン(下の赤い丸で囲んだ部分)をタップします。これを行うと、左側のオブジェクトを選択でき、オブジェクトの所有権の主張を示すオブジェクトグラフが表示されます。

ここに画像の説明を入力してください

上記は、選択された画像がUIImageView提示されている画像の両方から強い参照を持っていることを示していますが、ViewControllerも強い参照を維持しています。

以前のXcodeバージョンでは、アプリをプロファイリングしてInstrumentsで実行し、[参照カウントの記録]オプションを選択します。Xcode 6では、これは右端のパネルの[レコード設定]タブにあります。

ここに画像の説明を入力してください

Xcode 5以前では、私この「参照カウントの記録」オプションを表示するには、割り当てツールの横にある情報ボタンをクリックする必要があります。

ここに画像の説明を入力してください

とにかく、次に割り当ての概要に移動し、解放されなかったオブジェクトにドリルダウンし矢印ます(割り当てツールでオブジェクトを表示しているときにオブジェクトアドレスの横にある右矢印をクリックして)。次に、上記のように、問題のオブジェクトの保持と解放のリスト。ただし、これは、アプリのプロファイリングの前に[参照カウントの記録]を選択した場合にのみキャプチャされます。

この方法で保持カウントを追跡することに慣れるにはしばらく時間がかかりますが、強力な参照が確立された場所をどうしても知る必要がある場合は、[参照カウントを記録する]オプションが役立ちます。

于 2012-12-31T18:40:26.490 に答える