2011-08-04 9 views
1

iPhone SDKのメモリ管理の一面について考えています。ループ内でalloc'edの場合に作成されるオブジェクト数

私が実行した場合:

for (int x = 0; x < 10; x++) { 
    NSMutableArray *myArray = [[NSMutableArray alloc] init]; 
} 

は、私がメモリに10個のmyarrayのオブジェクトを作成しています、またはそれぞれのallocは前を上書きしますか?後者の場合は、ループの後でクリーンアップする必要があると私は思います。前者の場合、私はForループ内のリリースが必要であると推測します。

ありがとうございました。

+1

9個のリークがあるオブジェクト10個。 –

+0

お返事いただいた皆様に感謝します。私は疑念を抱いていたが、これは混乱を解消する助けとなった。 – Jeremy

答えて

1

10個のオブジェクトが作成されています。そのうちの9個はリークされています。 ループの最後で使用した後で解放する必要があります。

これはiPhone SDKだけでなく、基本的なココアのメモリ管理です。 Macでも動作します。

+0

リークは10で9ではなく... – sergio

+0

最後は10ですが、最後のインスタンス化が前の9(リーク)を上書きし、最後の割り当て後にはまだ10番目だけが残っていることを示したいと思います。 –

+0

私はオートリース、つまりループとしてNSMutableArray * myArray = [[[NSMutableArray alloc] init] autorelease]を呼び出すと、何が変わるのでしょうか? iOSがオブジェクトをいつ(自動)解放するのか分からない。 – Jeremy

2

メモリリークを望まない場合は、10個の異なる割り当てがあり、それらを解放する必要があります。

for (int x = 0; x < 10; x++) { 

    NSMutableArray *myArray = [[NSMutableArray alloc] init]; 
    .... 
    [myArray release]; 
} 

あなたが解放しない場合は、漏れたオブジェクトが実際に10、ない9コメントどおり、ループの外にいるので、あなたがループローカル変数へのアクセス権を持っていないでしょうし、最後に割り当てられたオブジェクトも希望到達不能です。

1

この場合、保持カウントが1で、参照はまったくない10個の異なるArrayオブジェクトを作成しています。これは、メモリから解放されることのない10個のオブジェクトを持つ「メモリリークファクトリ」になります。 :)

oooops ...リリース9のリークした配列を見ませんでした。

+0

あなたが見ているリリースが私の答えにあると思います...-))リークは10なので、あなたは正しい... – sergio

+0

lol ...私はもっと注意を払うべきです! – Marsson

2

実際には、10個のオブジェクトに10個のリークがあります。ループを終了すると、myArrayはもはや有効範囲にない(したがってアクセス不能になる)ため、10番目の割り当てを解除する方法もありません。

0
for (int x = 0; x < 10; x++) { 

    NSMutableArray *myArray = [NSMutableArray array]; //Its an autorelease 
    .... 
} 

これは、10種類の異なるNSMutableArrayオブジェクトを作成します。あなたは実際にそれらを明白に解放する必要はありません。 myArrayは、実行ループの最後にオートリリースされます。

あなたは、名前が「アロケーション」または「新規」または「コピー」を含んでいる(例えば、allocnewObject、またはmutableCopy)、またはあなたがそれを送信する場合で始まるメソッドを使用して、それを作成する場合は、オブジェクトの所有権を取得保持メッセージ。 releaseまたはautoreleaseを使用して、所有するオブジェクトの所有権を放棄する責任はお客様にあります。オブジェクトを受け取ったときは、それを解放してはいけません。

NSMutableArray *myArray = [NSMutableArray array];では、アレイの所有権を取得せず、自動的に自動転送されます。

メモリ管理の詳細については、hereをご覧ください。

0

誰もが(正しく言う)ことに加えて、Cocoaは自動リリースされたオブジェクトもサポートしています。あなたは、このようにあなたのスニペットを言い直す場合:

for (int x = 0; x < 10; x++) 
{  
    NSMutableArray *myArray = [NSMutableArray arrayWithObjects: ...];  
    //....  
} 

をあなたはまだ10種類の配列を割り当てるが、どれがリークされていません。彼らは最終的に自動リリースされます。

関連する問題