0

私はARC(自動参照カウント)を使用しています。

の代わりにIBOutletsを nilに設定しても問題ありませんか?viewDidDisappearviewDidUnload

これらのような:

[self setTheImage:nil];
[self setBTNplay:nil];
[self setBTNstop:nil];

を含むナビゲーション ベースのアプリを作成しています。Instruments でpageViewControllerアプリをテストしてメモリ リークを確認しましたが、受信メモリ警告メッセージが表示され続けます。メソッドにログコードも入れましたviewDidUnload。しかし、ポップしても呼び出されないようですrootViewController!

もう 1 つ: 各ページに audioPlayer がある場合、どこで a@property (nonatomic, strong) AVAudioPlayer *audioPlayer;を nil に設定する必要がありますか?

または、強いのではなく弱いに設定するにはどうすればよいですか? それは私に「警告」を与えるので、このコード行で:

_audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:poemURL error:nil];

それは言う:保持されたオブジェクトを弱い変数に割り当てる

4

4 に答える 4

2

でこれらの値をゼロにする必要はありませんviewDidUnload。strong または assign for ではなく、weak プロパティを使用していることを確認してくださいIBOutlet。受信したメモリ警告は、必ずしもリークしていることを意味するわけではありません。受信したメモリ警告は、アプリがメモリを消費しすぎていることを意味します。Instruments を実行し、アプリが使用するメモリ量で質問を編集します。

あなたが使用しているという事実はAVAudioPlayer、おそらくあなたがいくつかの巨大なオーディオファイルをメモリに取り込んでいると私に思わせます.

またinitWithContentsOfURL:error:、メイン スレッドをブロックしているため、App Store から拒否されます。セルラーのみが有効になっている iPhone でアプリをテストしてみて、インターネット接続が悪いオフィスや家の一部に入ります。また、携帯電話を機内モードに切り替えて試してみてください。アプリは間違いなく、接続が失敗する前に長時間フリーズするか、単にクラッシュします。

NSURLConnection代わりに、グランド セントラル ディスパッチを使用するか、のブロック メソッドまたはデリゲート メソッドを介してダウンロードする必要があります。

于 2012-07-04T19:58:36.537 に答える
2

まず、viewDidDisappearビューがまだ読み込まれているため、プロパティを nil に設定しないでください。では常に nil に設定する必要がありますviewDidUnload。これはメモリ不足の状況で呼び出され、ここではシステム メモリを壊すすべてのものをクリーンアップする必要があります。

AppleのUIViewControllerリファレンスviewDidUnload

メモリ不足の状態が発生し、現在のビュー コントローラーのビューが必要ない場合、システムはそれらのビューをメモリから削除することを選択する場合があります。このメソッドは、View Controller のビューが解放された後に呼び出され、最終的なクリーンアップを実行するチャンスです。

次に、このチュートリアルを見てください。ここでは、 ARCが非常によく説明されています。

于 2012-07-04T19:59:15.267 に答える
0

viewDidUnloadではなくviewDidDisappearでIBOutletsをnilに設定しても大丈夫ですか?

この声明には多くの間違いがあります。

まず、IBOutletsをnilに設定しませんviewDidDisappearviewDidDisappearビューが「消える」とき(たとえば、タブバーコントローラーにあり、別のタブに切り替えたとき、またはナビゲーションコントローラーにあり、その上に何かを押したとき)に呼び出されます。その後、ビューは再度ロードせずに再び「表示」できます。IBOutletsをnilに設定すると、表示されたときに再度設定されることはありません。(これらは、ビューがロードされたときにのみ設定されます。)

次に、リークがあり、nilに設定すると「修正」されます。これは、インスタンス変数を解放していないことを意味します。で保持されているインスタンス変数を常に解放する必要がありますdealloc

viewDidUnloadメソッドにログコードを入れました。しかし、rootViewControllerにポップしても呼び出されないようです!

はい、viewDidUnloadメモリが少ない状況でのみ呼び出されます。ほとんどの場合、通常は呼び出されません。呼び出されることに依存している場合は、間違った方法を使用していました。

于 2012-10-31T00:19:49.117 に答える
0

View Controller サブクラスの 1 つから呼び出してい[[NSNotificationCenter defaultCenter] removeObserver:self];ますか? もしそうなら、それはなぜあなたがviewDidUnloadを呼び出さないのかを説明するでしょう.

それが問題である場合は、上記のすべての通知ではなく、必要に応じて特定の通知から自分自身を削除する必要があります。(removeObserver:selfただし、dealloc から呼び出しても問題ありません。)

于 2012-07-05T01:37:14.147 に答える