2011-02-04 17 views
0

私のコードのこのセクションには、複数のメモリリークがあります。特にこれらの配列:PlaylistItem、PlaylistItemID、PlaylistItemLength。問題は、配列を正常に解放できないことです。私が挿入[xxxxリリース]を使用しようとすると、このコードのどこにいても、アプリはロックアップします。それは絶対にナルツ私を運転している!NSMutableArrayメモリリークの問題

-(void)configureCueSet { 
MPMediaQuery *myPlaylistsQuery = [MPMediaQuery playlistsQuery]; 
NSArray *playlists = [myPlaylistsQuery collections]; 

//Get # of items in a playlist and names ------------------------------------- 
NSArray *songs; 
for (MPMediaPlaylist *playlist in playlists) { 
    NSString *playListItem = [playlist valueForProperty: MPMediaPlaylistPropertyName]; 
    if ([playListItem isEqualToString: savedLastSelectedPlaylist]){ 
     songs = [playlist items]; 
    } 
} 
PlaylistItem = [[NSMutableArray alloc] init]; 
PlaylistItemID = [[NSMutableArray alloc] init]; 
PlaylistItemLength = [[NSMutableArray alloc] init]; 
for (MPMediaItem *song in songs) { 
    [PlaylistItem addObject:[song valueForProperty: MPMediaItemPropertyTitle]]; 
    [PlaylistItemID addObject:[song valueForProperty: MPMediaItemPropertyPersistentID]]; 
    [PlaylistItemLength addObject:[song valueForProperty: MPMediaItemPropertyPlaybackDuration]]; 
} 
} 

答えて

1

このメソッドは複数回呼び出されますか?そうであれば、あなたのリークはその割り当てで発生する可能性があります。あなたはしたいでしょう:

[PlayListItem release]; 
PlaylistItem = [[NSMutableArray alloc] init]; 

[PlayListItemID release]; 
PlaylistItemID = [[NSMutableArray alloc] init]; 

[PlaylistItemLength release]; 
PlaylistItemLength = [[NSMutableArray alloc] init]; 

以前にあったものをリリースしなければ、リークが発生します。

+0

ありがとうニック!それはトリックでした!それは今、そのような明らかな意味をなす。このメソッドは複数回呼び出されます。時には私は木の森を見ることができません! – Marsman

+0

ねえ、問題ありません。お役に立てて嬉しいです。クマに気をつけろ。 ;) –

1

[xxx release]を挿入しようとすると、配列ではなく内容が解放されます。配列に追加しようとしているオブジェクトの割り当てを解除するため、アプリケーションがクラッシュします。ドキュメント(here)によると、NSArrayの値は自動的に保持され、配列がdeallocされるとすぐに解放されます。したがって、これらの配列のいずれかを解放したい場合は、[PlaylistItem release]と入力するだけです。

+0

返信いただきありがとうございます。 [PlayListItem release]を追加する。 "SIGABRT"を生成します。私はうんざりしています。 – Marsman

+0

どこに追加しますか?あなたはそれらをもう必要としないと確信しているときだけ配列を解放するべきです。あなたのコードニットが行く限り、あなたは実際にそれらを使用せずに配列を塗りつぶしています。どこかにそれらを解放することは意味をなさないでしょう。 –

+0

配列は、アプリケーションの複数の場所で使用されます。だから私はもはや私がもはや配列を使用しているまで、漏れを入れている?私のアプリケーションは、リークのために拒否されませんか? – Marsman