2011-10-19 11 views
0
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

myClass *obj = [[myClass alloc] init]; 

NSArray *ar = [NSArray array]; 

[ar addObject: obj]; 

[ar removeObject: obj]; 

[pool drain]; 

NSArray配列からオブジェクトを削除すると、以前に割り当てたメモリが自動的に解放されますか?その答えは、私がさまざまな情報源から見いだしたことから肯定的なようです。問題は、メモリリークをテストしても、xcodeはobjが解放されていないと不平を言うことです。実際に何が起こっているのですか?NSArrayからオブジェクトを削除すると、自動的にそのメモリが解放されますか?

答えて

2

はい。配列にオブジェクトを挿入すると、配列はその配列を保持します(保持カウントにぶつかります)。オブジェクトの保持カウントが1の場合(つまり、他の保持がない場合)、配列から削除されると、保持カウントはゼロになり、削除される可能性があります。

しかし、上記のシナリオでの問題は、オブジェクトを配列に追加した後で、(alloc/initのために)オブジェクトに対するあなたのretainを解放できなかったことです。 [ar addObject:obj]の後に[obj release]を挿入します。

(また、あなたの自動解放プールを排出するとき、あなたの例では、アレイ全体が「パッ」となりますので注意してください。)

+0

ありがとうございます、あなたの助けは大いに感謝しています。 =) – hollow7

+1

"NSArray配列からオブジェクトを削除すると、以前割り当てたメモリが自動的に解放されますか?" - 厳密に答えはいいえです。あなたが割り当てたメモリは解放されず、配列自体が送信した保持を解放するだけです。 –

+0

あなたの "ノート"は誤解を招く可能性があることに注意してください。プールが排水されると、配列は 'release'を受け取りますが、その中にあるオブジェクトは他のものによっても所有されています。 –

2

はありません、あなたはそれをALLOC - > 1

のカウントを保持あなたがオブジェクトを送信し、配列に追加する別の保持 - > 2

あなたは配列からオブジェクトを削除し、配列を送信release - > 1

...ここで、保持カウントは1に戻ります。これは最初の割り当て保持であるため、解放する必要があります。

3

コレクションは、一時的な所有権を主張し、あなたがそれらに追加するオブジェクトを保持します。コレクションからアイテムを削除すると、オブジェクト(およびその一時的な主張)が解放されます。つまり、オブジェクトをコレクションに追加する前と削除した後の保持カウントは同じになります。

保持カウントが0の場合、メモリは再利用されます。

あなたのコードでは、オブジェクトを割り当てて、オブジェクトの所有権を主張しています。つまり、保持カウントが1であることを意味します。

次に、配列に追加します。配列はオブジェクトを保持し、一時的な所有権を持ち、保持カウントを2に上げます。

オブジェクトを配列から削除します。配列はオブジェクトを解放し、所有権の所有権を放棄して保持カウントを1に戻します。

保持カウントが0に戻るまで(オブジェクトにクレームを持たない)メモリは再利用されないため、オブジェクトのメモリ再生されません。

オブジェクトを配列に追加する前にオートレリースしていた場合、またはオブジェクトを削除した後でオブジェクトのリリースを呼び出した場合(両方!ではない)、保持カウントは0になり、メモリは再利用されます。

関連する問題