2

Appleのドキュメントには、次のように書かれています。

AppKit フレームワークと UIKit フレームワークは、自動解放プール ブロック内の各イベント ループ反復 (マウス ダウン イベントやタップなど) を処理します。したがって、通常、自動解放プール ブロックを自分で作成する必要はなく、作成に使用されるコードを確認する必要さえありません。

さて、これは明らかなはずですが、とにかく確認を求めます。

最終的にバックグラウンド プロセスになるものを開発している場合 (グランド セントラル ディスパッチ経由)、簡単にするために、最初の読み込みビューの viewDidLoad に入れて、ビューが実際に画面に表示されないようにします。すべての (たとえば) 2 分間の処理が完了した後、この 2 分間、デフォルトの自動解放プールはすべて解放されません。これは、イベント ループの繰り返しがまだ行われていないためです。「いいえ」と聞くのは正気ではありませんが、私はこの増大するメモリの問題で立ち往生しているので、確認を求めて良いニュースを期待します.

もしそうなら、私は自分の自動解放ブロックを置くべきです。処理が GCD を介してバックグラウンド プロセスで行われる場合、自動解放ブロックが必要になりますよね?

4

2 に答える 2

4

私はあなたにあなたの両方の質問の完全な答えを与えるように努めます。

パート1。まず、メインスレッドでの長時間実行操作に注意してください。たとえば、操作に2分かかる場合、メインスレッドは完了するまでブロックされます。ユーザーの観点からは、アプリは2分間応答しません。とにかく、はい、アプリケーションデリゲートには、自動解放されたオブジェクトが挿入されるプールがあります。ループが終了すると、プールが自動的に排出されるため、プール内のオブジェクトが解放されます。メモリに問題がある場合は、[ローカル自動解放プールブロックを使用してピークメモリフットプリントを削減する]を参照してください。ドキュメントに書かれているように、自動解放ブロックで操作をラップする必要があります。ブロックの終わりに、一時オブジェクトが解放されます。これにより、通常、オブジェクトの割り当てが解除され、プログラムのメモリフットプリントが削減されます。

GCDの質問については、私はノーと言います。GCDを扱うときに、自動解放プールを作成する必要はありません。通常、「GCDのブロック内にNSAutoreleasePoolを作成する必要がありますか?」にも書かれています。、GCDは、キューごとに自動解放プールを自動的に管理します。したがって、オブジェクトが少ない場合は心配する必要はありませんが、オブジェクトをたくさん作成する場合は、はい、自動解放プールを作成します。後者を使用すると、メモリフットプリントも削減できます。

つまり、アプリが応答しないこの2分間は、ループが終了しておらず、この2分間はプールが空になっていないのですよね?

メインスレッド(実行ループを介して)がタスクを順番に実行するため、アプリは応答しません。実行ループをブロックすると、長時間実行操作が終了するまでアプリがフリーズします(特定の期間を超えると、アプリはiOSによって強制終了されると思います)。これを回避するために、(あなたが書いたように)別のスレッドで長時間実行される操作を実行することができます。

スレッドを使用する目的は、アプリケーションの応答性を高めることですが、データの不整合(競合状態)やデッドロックなどのさまざまな問題を引き起こす可能性があります。

詳細については、NSRunLoopのポゴスティック、 NSRunLoopとNSDefaultRunLoopModeとNSRunLoopCommonModesの理解を読むことをお勧めします。

于 2012-08-31T16:30:25.003 に答える
0

自動解放されたオブジェクトのメモリを管理するために、独自の自動解放ブロックを作成する必要はありません。プールがあり、自動的に管理さ、自動解放されたオブジェクト最終的に解放されます。

したがって、唯一の問題は「最終的に」という魔法の言葉です。自動解放されたオブジェクトがまだ解放されていないために、処理中にアプリがメモリを使いすぎていませんか (たとえば、システムが強制終了するほどのメモリを使用していますか)。それらは解放されることを忘れないでください。問題は、状況が非常に悪いため、自動解放プールの空になるのを待たずに、今すぐ解放する必要があるかどうです

インストゥルメントだけが教えてくれるので、推測したり、時期尚早に最適化したりしないでください。Instrumentsが明らかにするものを見てください。状況がそれほど悪い場合は、自動解放されたすべてのオブジェクトを生成しているループを見つけ、その中に自動解放ブロックを配置して、プールがループを通過するたびにドレインされるようにします。そうでなければ、本当に必要ありません。(一方、ARC では、autorelease ブロックはほとんどオーバーヘッドを追加しないため、時期尚早に最適化してもおそらく大きな害はありません。)

于 2012-08-31T17:06:31.743 に答える