2009-06-17 23 views
4

私はC#、VB.NETなどから来たObjective-Cの新しいプログラマです。これらはすべてガベージコレクションされた言語ですが、プログラムの終了時にはメモリ使用量の乱用が最も悪いことがあります。メモリはランタイムによって再利用されます。プログラムの終了後にObjective-cとメモリリークが発生する?

しかし、Objective-Cについてはっきりしていません。オブジェクトの割り当て、初期化、保持および解放を管理するための開発者として私たちの大部分を占めています。私はこれを行うために最善を尽くしてゆっくりと考えています。

私の心配はこれです:用語のメモリリークを正しく理解しているかどうかわかりません。これはメモリを適切に解放しないことを指していますか?そして、アプリケーションがシャットダウンすると、未使用のメモリがありませんか?言い換えれば、私のプログラムがシャットダウンしても、Mac OSはプログラムが使用していたすべてのものがクリーンアップされていないことを確認していませんか?

私はこれが意味を持ち、プログラムが実行されている間に、プログラムがシャットダウンした後の違いを実際に理解することを望みます。

答えて

3

を調べることによってリークを見つけるための非常に貴重な発見した打ち鳴らす静的解析ツールで、この1正しく漏れます。これはメモリを適切に解放しないことを指していますか?そして、アプリケーションがシャットダウンすると、未使用のメモリがありませんか?

いいえ。アプリケーションが終了したときにOS Xがすべてのメモリを再利用しているため、メモリリークはメモリのリークです()。そうでないと、コーディングやメモリ管理が不十分で大きな問題が発生し、システム全体に影響を与える可能性があります。

基本的にはオブジェクトをあまりにも多く保持しているか、十分なメモリを解放していないということです。配列にオブジェクトを追加するとき、例えば、これはそれをやって行くための一般的な方法です:

NSMutableArray *array; //Pointer to some already allocated array 

[array addObject:someObject]; 
[someObject release]; 

someObjectが正しく割り当てられていたと仮定すると、それは1の保持カウントを開始します。配列にオブジェクトを追加すると、配列には問題のオブジェクトのretainが呼び出され、この場合は2になります。

配列が解放されると、オブジェクトはすべてオブジェクトに送信されます。このシナリオでは、保持カウントは1に戻ります(他の誰もオブジェクトを保持していなかったと仮定して)。これは0ではないので、someObjectはまだ存在します。 someObjectがメソッド内に作成されたローカルポインタで、そのオブジェクトへのポインタがなくなった場合は、メモリがそこにぶら下がります。これはメモリリークの例であり、アプリケーションにより多くのメモリを使用させ、を必要とし、終了するまで苦労します。

0

いいえ、OSは、アプリケーションを終了するときにすべてのメモリを解放する必要があります。メモリリークが処理されない場合、アプリケーションがクラッシュします。簡単に言うと、デバイスには10MBのRAMが搭載されており、関数を呼び出すたびにメモリが漏れています。遅かれ早かれあなたはラムを使い果たし、あなたのアプリはクラッシュするでしょう。

Appleは、メモリリークを追跡して修正するための優れたツール「Instruments」を提供しています。私はあなたがこれを毎回アプリを実行してから、漏れをチェックすることをお勧めします。私はallocを呼び出すときにオブジェクトを解放するつもりの場所をいつも見つけていることに気づいた。私がallocを呼び出し、それが自動解放でない場合、私はリリースを置く場所を見つけなければならない。

1

OSはメモリを解放しますが、それまで漏れている可能性があります。だから、シャットダウン時に漏れの報告を受けているのであれば、それはまだリリースされていないオブジェクトです(ただし、メモリは現在再利用されています)。

iPhone用のobjective-cメモリ管理を理解するためのブログエントリを書きました。私は長期記憶を理解している場合わからない

http://loufranco.com/blog/files/managing-memory-iphone.html

と私はソース

http://loufranco.com/blog/files/scan-build-iphone.html

関連する問題