3

私は ARC を使用してかなり単純なアプリケーションを作成しました。ただし、メモリ不足に陥っていますが、何が原因なのかわかりません。何が原因なのかはっきりしないので、具体的な詳細と質問がいくつかあります。

新しいView Controllerをロードしようとすると、問題が発生します。このView Controllerは多数の画像をホストし、ロードされると、3〜4分のオーディオファイルをAVAudioPlayer私が持っているシングルトンクラスに追加します。

この問題は、View Controller が 8 ~ 10 回プッシュおよびポップされると発生します。ビュー コントローラーがポップされると、 を呼び出しstopて、AVAudioPlayer関連するすべてのオブジェクト (AVAudioPlayerインスタンスを含む) を nil に戻します。

何がメモリ リークを引き起こしているのか、またはデバイスのメモリを破壊している可能性があるものはよくわかりませんが、具体的な質問がいくつかあります。

を停止しAVAudioPlayerても、メモリ内で適切に解放できますか?

AVAudioPlayer呼び出し後にポインタを nil に設定するとstop、システムがデバイス メモリから特定のデータを解放できなくなりますか?

ARC では、所有者の割り当てが解除されたときに何も解放されるべきではありませんか (UIViewControllerスタックから取り出されたすべてのビューとデータについて質問しています)。

知っておくべき ARCに関する、AVFoundationまたはARC 内の問題はありますか?AVAudioPlayer

stopオーディオ セッションを終了する方法が間違っているか、それを解放する必要がありますか?

編集:割り当てとリークを追跡するために、instruments ツールの使用を開始しました。ツールによると、メモリ リークは発生していませんが、実際のバイト数に関係なく、アプリケーションはクラッシュします。使用される RAM の合計が 200MB (210 ~ 230MB - 私のデバイスには 256MB の RAM があります) を超えると、アプリケーションはクラッシュします。私の新しい質問は、割り当てられた合計バイト数 (ライブでなくても) がメモリ クラッシュに影響するかどうかです。もしそうなら、どうすればこれを防ぐことができますか?

これは、クラッシュした実行のイメージです。最後に、メモリ警告の塊が表示されます。

4

2 に答える 2

5

Q) View Controller を 8 ~ 10 回押してポップすると問題が発生します。ビュー コントローラーがポップされると、AVAudioPlayer で stop を呼び出し、関連するすべてのオブジェクト (AVAudioPlayer インスタンスを含む) を nil に戻します。A) dealloc メソッドを追加し、dealloc をログに記録します。これにより、それらが保持されていないことがわかり、コンソールでこれらを探します。

- (void)dealloc
{
  NSLog(@"MySpecialViewController getting dealloced!");
}

これらのオブジェクトが保持されていない場合は、おそらくデリゲートです。

Q) 何がメモリ リークを引き起こしているのか、デバイスのメモリを破壊しているのか、よくわかりませんが、具体的な質問がいくつかあります。A) Instruments (および Leaks) で ObjectAlloc を使用する必要があります。これらは非常に簡単に使用できます。シミュレーターでプロジェクトを実行し、デフォルトを使用するだけで、多くの優れた情報がすぐに得られます。本当に役立つはずの何が漏れているかがわかります。

Q) AVAudioPlayer を停止すると、メモリ内で適切な解放が可能になりますか? A) いいえ。強い ivar/property を nil に設定する必要があります (そうしていると言っていました)。確認したところ、AVAudioPlayer はデリゲートを保持していません。とはいえ、原則として、何かをシャットダウンするときは次のようになります。

[something stop/cancel/etc]; 
something.delegate = nil; 
something = nil;

stop を呼び出した後に AVAudioPlayer ポインタを nil に設定すると、システムはデバイス メモリから特定のデータを解放できなくなりますか?

Q) ARC では、所有者の割り当てが解除されたときに何も解放されるべきではありません (スタックからポップされる UIViewController 内のすべてのビューとデータについて質問しています)。A) ViewController を保持している唯一のもの、たとえば、navigationController の viewControllers 配列の場合、はい、viewController サブクラスの割り当てを解除する必要があり、すべての強力なプロパティと ivar も解放されます。

Q) ARC の AVFoundation または AVAudioPlayer に知っておくべき問題はありますか? A)私は何も知りません。これは人気のあるクラスなので、問題はコードにあると考えてください。

Q) 音声セッションを終了する方法として stop を呼び出すのは間違っていますか? / 解放されますか? A) 私だったら:

[avPlayer stop];
avPlayer.delegate = nil;
avPlayer = nil;

編集: アプリの実行中にメモリの警告が表示される場合は、大量のメモリがリークしているか消費されています。この警告が表示される場所にブレークポイントを設定し、アプリを停止して、割り当てを確認します。実際にメモリ警告が表示されたことはありません (私は ARC のみを使用しています)。

于 2012-09-03T20:01:36.423 に答える
0

ARCの使用中にメモリの問題が発生しやすい領域の1つは、バックグラウンドスレッドからのメインスレッドを必要とするCocoaTouchAPIを操作している状況です。

これに反対しているようには聞こえませんが、一貫性のない動作(たとえば、ランダムなクラッシュのように見えるもの、オブジェクトが時期尚早にスコープから外れるなど)が見られるようになった場合は、対話しているかどうかを確認するためにある程度の努力を払う価値がありますバックグラウンドスレッドからのCocoaTouchを使用します。

Cocoa Touchからのコールバック(メインスレッドにあると思われるかもしれません)がそうでない場合があります(これは一部のGame Center APIで見られます)。

于 2012-09-03T21:17:29.267 に答える