1

メモリ管理についていくつか質問があります。私はARC、xcode 4.2.1を使用しており、ios 5.0+に展開しています

1) アプリがメモリを効率的かつ正しく管理していることをどのように確認しますか? Instruments リーク ツールで測定してメモリ リークが発生していない場合、アプリは完全に正常ですか?

2) アプリがメモリを適切に管理しているかどうかを判断するために、Leaks 以外のツールを使用する必要がありますか?

3) アプリを実行し続けると、ライブ バイトが増え続けます。私のアプリには、いくつかのデータを表示する UITableView があります。ユーザーが行をクリックすると、より詳細なページに移動します。アプリがこれだけを実行しているのに、ライブ バイトが増加し続けるのはなぜですか? すべてのオブジェクトを解放して、ライブ バイトを最初にアプリを起動したときの状態に戻すべきではありませんか?

4) malloc とは正確には何ですか?

アプリケーションの完成が近づいていますが、アプリケーションがリリース可能かどうかを測定する方法と、問題を特定する方法を知りたいだけです。

ありがとう!

4

3 に答える 3

3

アプリが効率的かつ正確にメモリを管理していることをどのように知ることができますか?

  • 操作対象のデータが何であれ、適切な量のメモリで動作しているように見えますか?それとも、予想よりも多くのメモリを使用していますか?

  • プログラムが何もしていないとき、そのメモリ使用量は妥当で安定していますか?

  • プログラムを徹底的に実行すると、メモリ使用量は安定しますか、それとも際限なく増加するように見えますか?

  • プログラムは、OS からのメモリ警告に適切に応答していますか?

  • メモリ不足の状態を正常に許容できますか?

アプリがメモリを適切に管理しているかどうかを判断するために、Leaks 以外のツールを使用する必要がありますか?

アプリがメモリをどのように使用しているかを調べるには、Instruments のさまざまなツールで十分です。アプリのメモリ使用量が時間の経過とともにどのように変化するかを確認できるように、Instruments セッションの結果をいくつかのメモと共に保存することを検討してください。

アプリを実行し続けると、ライブ バイトが増え続けます。

それは問題になる場合とそうでない場合があります。追加され続けるブロックに何が入っているかを知ることは役に立ちます。デバイスに利用可能なメモリがある場合、特にアプリのパフォーマンスが向上し、何らかのソースからの同様のデータのダウンロードを回避できるなどの場合は、それを使用しても問題はありません。ただし、アプリが新しいビュー コントローラーとビューを解放せずに割り当て続ける場合古いもの、それはおそらくリークです。

mallocとは正確には何ですか?

malloc()C 標準ライブラリのメモリ割り当て関数の 1 つです。Allocations Instrument の Category 列にMalloc 16 bytesのような行が表示されているため、質問しているように感じます。

楽器のイラスト

これらの行は、によって割り当てられたメモリ ブロックのカテゴリを表しますmalloc()。ご覧のとおり、私の場合、malloc()現在プログラムで使用されている 16 バイト ブロックが 3318 個あります。正確な数はそれほど重要ではありません。重要なのは、その数が時間の経過とともにどのように変化するかです。malloc()いくつかのアクションを実行するたびに、いくつかのブロックが使用され、決して解放されないことがわかった場合は、メモリの問題についてプログラム内のどこを調べればよいかの手がかりが得られます。(もちろん、他の種類のブロックについても同じことが言えます。)

于 2012-07-19T01:48:14.937 に答える
2
  1. アプリがメモリを効率的かつ正確に管理していることをどのようにして知ることができますか?リークがなく、理由がない限りメモリサイズが大きくならない場合にそれを知っています。Appleは、 WWDC 2012「iOSアプリのパフォーマンス:メモリ」やWWDC2010「機器を使用した高度なメモリ分析」などの有益なビデオを多数リリースしています。

  2. リークは、到達不能なメモリを見つけるのに役立ちます。プログラムには、もう到達できないメモリがあります。到達可能であるが役に立たないメモリを見つけるのに役立ちません。無制限に成長しているキャッシュ、または古いサブビューを非表示にする新しいサブビューを取得し続けるビューです。Allocationsインスツルメントを使用して、時間の経過とともにメモリを割り当てているものを確認できます。基本的な手法は、[ヒープのマーク]をクリックし、(アプリで)割り当ての正味ゼロの変更をもたらすと思われるアクションを実行してから、ヒープを再度マークして、解放されるべき新しいものを確認することです。繰り返しになりますが、Appleにはこれをより詳細に説明するビデオがあります。

  3. #2を参照してください。

  4. これに対処するstackoverflowには、次のような回答がすでにあります。

malloc()は内部でどのように実装されていますか?
malloc()とfree()はどのように機能しますか?
FreeとmallocはCでどのように機能しますか?

および次のようなWebページ:

http://en.wikipedia.org/wiki/C_dynamic_memory_allocation
http://web.eecs.utk.edu/~huangj/cs360/360/notes/Malloc1/lecture.html

于 2012-07-19T00:34:22.633 に答える
1

1)これはアプリケーションの動作によって異なります。単純なタスクを実行する単純なアプリケーションを実行している場合、効率的なメモリ使用量はそれほど重要ではありません。あなたは、むき出しのメモリを消費するアプリケーションを書くことにもっと焦点を合わせます。ただし、プロジェクトで筋肉が必要な場合、または集中的な計算を実行する場合、メモリの最適化は、エッジ周辺の脂肪のトリミングに完全に焦点を合わせます。

2)もちろんです。オブジェクトのライフサイクルを管理するために、ゾンビ、割り当て、さらにはタイムプロファイラーが存在します。

3)アプリケーションは、実際には、説明した内容よりも多くのメモリを使用している必要があります。ナビゲーションスタックがビューコントローラーをスタックの上位にリリースすることを期待しているようです。これは、ナビゲーションスタックが存在する理由とは正反対です。より多くのViewControllerをスタックにプッシュすると、管理する新しいView Controllerがあるため、メモリ使用量が増加します。アプリがメモリの大部分を削除している場合は、ゾンビオブジェクトに大きな問題が発生するため、心配する必要があります。

4)mallocはallocのCバージョンです。唯一の違いは、allocが実行時の魔法を少し実行し、クラスのisaポインターを設定し、最終的にmallocを呼び出す前にオブジェクトごとのマイナーな値を微調整することです。Mallocはメモリのブロックを割り当て、オブジェクトへのポインタを返します。有効なポインタが必要であり、それ自体が文字通りメモリのブロックであるため、プリミティブではなくオブジェクトのみを割り当てるのはそのためです(プリミティブを指すことができ、mallocが必要になることに注意してください)。

于 2012-07-19T00:34:31.280 に答える