2011-02-04 5 views
0

Plusieurs fuites de mémoire se produisent dans cette section de mon code. Spécifiquement avec ces tableaux: PlaylistItem, PlaylistItemID et PlaylistItemLength. Le problème est que je ne parviens pas à libérer les tableaux. Lorsque j'essaie d'utiliser insert [xxxx release]; n'importe où dans ce code, l'application se bloque. Ça me donne absolument envie!NSMutableArray Memory Leak Problème

-(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]]; 
} 
} 

Répondre

1

Cette méthode est-elle appelée plusieurs fois? Si c'est le cas, votre fuite se produit probablement sur cette affectation. Vous voudriez:

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

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

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

Si vous ne libérez pas ce qui était là avant, alors vous aurez une fuite.

+0

Merci Nick! Cela a fait l'affaire! Cela a un sens si évident maintenant. La méthode est appelée plusieurs fois. Parfois, je ne peux pas voir la forêt pour les arbres! – Marsman

+0

Hey, pas de problème. Heureux d'avoir pu aider. Méfiez-vous des ours. ;) –

1

Une tentative d'insertion de [xxx release] libérerait le contenu, pas les tableaux. L'application se bloque parce que vous libérez l'objet que vous allez ajouter au tableau. Selon la documentation (here), les valeurs dans un NSArray sont automatiquement conservées, et seront libérées dès que le tableau est libéré. Donc, si vous voulez libérer l'un de ces tableaux, tapez simplement [PlaylistItem release].

+0

Merci pour la réponse. Ajout de [version de PlayListItem]; produit "SIGABRT". Je suis déconcerté. – Marsman

+0

Où l'ajoutez-vous? Vous ne devez libérer les baies que lorsque vous êtes sûr de ne plus en avoir besoin. En ce qui concerne votre code, vous remplissez les tableaux sans les utiliser. Les relâcher quelque part n'aurait aucun sens. –

+0

Le tableau est utilisé à plusieurs endroits dans l'application. Donc, je viens de supporter les fuites jusqu'à ce que je n'utilise plus les tableaux? Mon application ne sera-t-elle pas rejetée pour les fuites? – Marsman