2011-08-14 15 views
0

可能性の重複:
Objective C Memory Managementメモリリーク - Objective Cの

私のコードはここでメモリリークを示している:それはあるので

NSMutableArray* newImageArray = [[NSMutableArray alloc] init]; 
NSMutableArray* newMediaArray = [[NSMutableArray alloc] init]; 

if (self.categoryIndex == 0) { 
    for (int i=1; i < [categoryArray count]; i++) 
    { 
     newImageArray = [NSMutableArray arrayWithArray:[newImageArray arrayByAddingObjectsFromArray:[self getImageArrayByCategoryIndex:i]]]; 
    } 
} 
else { 
    newImageArray = [self getImageArrayByCategoryIndex:self.categoryIndex]; 
} 

for (int i=0; i < [newImageArray count]; i++) 
{ 
    Media* media = [[Media alloc] init]; 
    NSString* imageFile = [newImageArray objectAtIndex: i]; 

    media.imageFile = [UIImage imageNamed:imageFile]; 
    media.imageLabel = [[imageFile lastPathComponent] stringByDeletingPathExtension]; 
    media.soundFile = [appFolderPath stringByAppendingString:[[[imageFile stringByDeletingPathExtension] stringByAppendingString: @".wav"] stringByReplacingOccurrencesOfString: IMAGES_FOLDER withString: SOUNDS_FOLDER]]; 

    [newMediaArray addObject:media]; 
} 

self.mediaArray = newMediaArray; 

[self setNextMediaIndex]; 

私はメディアを解放していないですnewMediaArray(私の主なオブジェクトであるmediaArrayによって使用される)によって使用されています。私の主な目的を解放すると、すべてが解放されるべきではありませんか?

+1

ようこそ読まなければならないほとんどです。なぜユーザー名を選んで自分を快適にしてみませんか?また、このコードを他の質問の編集として投稿してください。 – Moshe

+0

'if'ブランチでは、元の' newImageArray'にオブジェクトを追加するのではなく、 'for'ループの各反復で完全に別の配列に置き換えて、元の配列を漏れさせます(他は自動解放されます)。おそらく '[newImageArray addObjectsFromArray:...];'が必要です。 'else'ブランチは、別の配列を割り当てているので元の配列もリークします。 2回目の 'for'では、繰り返しごとに' Media'オブジェクトをリークします。 'self.mediaArray = newMediaArray;の後に' newMediaArray'も解放しません。 – albertamg

答えて

1

newImageArray割り当てられたが、決して解放、additionalyあなたが別のバージョンとあなたのコードの1行目に割り当てられたバージョンを上書きされます。したがって、このコードセグメントの最後にリリースしたとしても、間違ったバージョンがリリースされます。あなたにもこれを割り当てる必要はないようです。

newMediaArray割り当てられたが解放されません、あなたはプロパティは、セッターがnewMediaArrayがリークを作成する、つまり値をretainすることを宣言した方法に応じて、そのプロパティのコードを作成するために@synthesizeを使用している場合は、プロパティmediaArrayに割り当てます。

mediaは割り振られていますが、決してリリースされない場合、NSMutableArrayに追加されます。つまり、配列によって保持されます。あなたのアプリがクラッシュした場合は、forループでmediaを離すと、問題はどこか別の

Memory Management Programming GuideあるのStackOverflowに

0

newMediaArrayなどのNSMutableArrayがオブジェクトを追加すると、そのオブジェクトが保持されます。アレイのためにオブジェクトを保持する必要はありません(また、そうする必要はありません)。これは基本的にObjective-Cのメモリ管理がどのように動作するかです。各オブジェクトは参照するものを保持し、終了すると解放します。 newMediaArrayは独自のオブジェクトなので、独自の参照を管理します。

forループのボディの末尾付近にmediaをリリースする必要があります。そのオブジェクトを使用し終えたからです。あなたがそれを解放しなければ、それへのあなたの参照を失うでしょう、あなたは将来それを解放する方法がありません。

0

あなたはnewMediaArraymediaretainを行っていることを意味し

[newMediaArray addObject:media]; 

を行います。 mediaになるはずです)をリリースすることができます。配列メソッドで行われたretainは、配列がそれを参照している限り、それを生き続けるでしょう。あなたのメソッドでそれを解放しない場合、保持カウントは2のままで、配列がそれを解放しても、それは1のままであり、解放されません。

あなたが行うことができ

:このメソッドが終了する前

Media *media = [[[Media alloc] init] autorelease]; 

その後自動解放プールは時間にそれを解放しませんが。

0

ループの最後に[media release]ステートメントが必要です。 newMediaArrayは、mediArrayプロパティに割り当てられた後にリリースする必要があります。あなたは、さまざまな方法ですべての場所の上にリークしているように見えます

関連する問題