2010-12-10 18 views
0

Salut J'ai beaucoup de problèmes pour supprimer les objets de ma matrice mutable.Objets de mise à jour NSMutableArray insérés. -> provoque une fuite de mémoire

J'ai une méthode qui renvoie un mutable initialisé avec un objet personnalisé. Ce mutable est déclaré comme autorelease pour libérer après la méthode. A mon retour, je retiens le mutable pour ne pas le perdre. Je veux dans cette deuxième méthode pour enlever le contenu de mon mutable et libérer mon mutable. Mais mon application quitte et échoue.

//first method which return my mutable 

NSMutableArray *highScores = [[[NSMutableArray alloc] init]autorelease] ; 

    for (....) 
    { 

    HighScore *currentHighScore = [[HighScore alloc] init]; 

    currentHighScore.user = name; 
    currentHighScore.score = score; 

    //add to the array 
    [highScores addObject:currentHighScore]; 
    [currentHighScore release]; 

    } 

return highScores; 

// method which use the first method 

//retrieve with retain to keep. 

    highScoreList = [[HighScoreViewController getHighScores:NormalGameModeXML]retain] ; 

    HighScore *currentHighScore; 

    int count = [highScoreList count]; 

    for (int i = 0; i < count ; i++) 
    { 
     currentHighScore = [highScoreList objectAtIndex:i]; 
    } 

Ceci fonctionne, mais bien sûr j'ai une fuite de mémoire pour tous les objets dans le mutable non libéré. Mais si je suis en train de libérer l'objet de la mutable et le mutable lui-même par ceci:

//remove Mutable array content. 
//[highScoreList removeAllObjects] ; 
//[highScoreList release]; 

Mon application Cesser.

Avez-vous une solution pour éviter la fuite de mémoire et la nettoyer correctement?

+0

Si vous exécutez le débogage lorsque votre application se bloque, que dit-elle sur la console? ce qui est sur la trace de la pile? – filipe

+0

Où voyez-vous cette fuite de mémoire? Que le programme se bloque dans le cas 2dn est évident. Vous libérez un objet autorelease. – nils

+0

Filip: quand je cours en débogage pour le scénario 2 (libérer et supprimer des objets): EXC_BAD_ACCESS – Tommy

Répondre

4

Essayez d'utiliser NSZombieEnabled pour vérifier la raison d'une EXC_BAD_ACCESS ..

HowTo is found here..

+0

Thx beaucoup, le problème était le dealloc de mon highscore (nom d'utilisateur) a été publié et jamais instancié .. merci! – Tommy

1
//[highScoreList removeAllObjects] ; 
    //[highScoreList release]; 

Pas besoin de removeAllObjects avant la libération.

Notez que si vous utilisez highScoreList après avoir été désalloué, votre application se bloquera pendant que vous décrivez. C'est à dire. si vous utilisez highScoreList après ce qui précède, BOOM.

Vous pouvez définir highScoreList à nil, mais une meilleure solution consiste à comprendre pourquoi vous utilisez un objet après avoir pensé que vous devriez en avoir fini avec lui.

Et, comme toujours:

S'il y a un accident, il y a une rétrospection. Postez-le.