0

私のアプリはViewDidLoadごとにメモリを割り当て、解放しないと仮定しました。そして、私のアプリは、メモリの断片化を引き起こすいくつかの作業を行います。

iOS はそのリークしたメモリを取得しますか、それともリークしたメモリは次の再起動まで影響を受けませんか?

iOS はその断片化したメモリを修正しますか、それともメモリは次の再起動まで断片化されますか?

私が知りたいのは、iOS がリークや断片化されたメモリを処理して、他のアプリがスムーズに実行できるかどうかです。

この動作は、他のモバイル OS (Android、Windows Phone、BlackBerry) でも同じように発生しますか?

私が読んだことからメモリリークを見つけて修正する

All memory you allocate during execution of your app is freed by the system when your app shuts down. This includes any leaks you introduce

これは本当のようです。でも反対のことを言う人が多くて混乱するから

4

2 に答える 2

1

iOS と Android (Windows Phone については知りません) では、アプリは、デバイスで実行されている各アプリに割り当てられた限られた量のメモリを使用できます。

iOS では、1 つのアプリが OS に割り当てられたよりも多くのメモリを使用しようとすると、アプリが強制終了せずにメモリを解放できるように、このメモリ警告には 3 つのレベルがあると思います。最初の 2 つのレベルでメモリの割り当てが解除されていない場合、次の memoryWarning でアプリが強制終了され、メモリが解放されます。また、OS は、優先度の低いアプリケーション (バックグラウンドのアプリ) からメモリを解放しようとします。

したがって、iOS では、アプリケーションで使用されているメモリを解放しないと、OS が強制終了の代償を払ってメモリを解放します。

Andorid では状況が少し異なりborrrden、Android ではガベージ コレクションが使用されますが、メモリ リークは依然として存在します。

そのため、Android では、各アプリが初期サイズのヒープを割り当てており、ヒープがヒープのシステム制限を超えてヒープを増やそうとすると、アプリはOutOfMemoryError以前の警告なしで有名になり、特定のポイントまで増加する可能性があります。アプリが強制終了され、メモリが解放されます。

また、Andorid のもう 1 つの厄介な点は、Android のほぼすべてのバージョンで最大ヒープ サイズが異なることです。そのため、一部のデバイスではアプリが OOM でクラッシュし、別の Android バージョンでは正常に動作する可能性があります。Android の最後の厄介な点は、Android の最新バージョンでのみ、メモリが解放されるとヒープ サイズが減少することです。これは、ヒープが完全に使用される前にシステムがヒープ サイズを増加させるため、OOM を引き起こす可能性があります (防止するのは皮肉なことです)。 OOM) であり、ヒープ サイズが減少していないため、最大ヒープ サイズを超えます。

また、Android には、onLowMemoryシステム全体に十分なメモリがない場合に呼び出されるメソッドがありますが、このメソッドはほとんど呼び出されません。

結論として、OS がメモリを必要とする場合に備えて、Andorid と iOS の両方がメモリを解放しますが、これはforce closeアプリで可能です。メモリ使用量のベスト プラクティスを考慮する必要があります。また、OS がアプリを作成するだけでメモリを解放しないようにする必要があります。これにより、できるだけ少ないリソースを使用し、アプリが未使用のメモリをすべて解放する必要があります。

于 2013-05-22T08:38:23.423 に答える
1

プロセスが終了すると、プロセスのすべてのメモリが OS に返されます。メモリを断片化しているとはどういう意味かわかりませんが、そのメモリはすべて返され、OS はそれを他のプロセスに分配し続けます。メモリの状態は関係ありません (必要に応じて割り当てを適切にゼロにするのはプログラマの責任です)。

Windows Phone と Android はガベージ コレクションが行われるため、メモリ リークはほとんど問題になりません。ブラックベリーについてはわかりません。

于 2013-05-22T03:26:39.783 に答える