2010-09-15 10 views
1

J'ai pilonné ma tête contre mon moniteur pendant des heures (et lire les messages similaires). Je suis toujours perplexe.Encore un autre Leaking NSMutableDictionary Poster

Je déclare un tableau dans mon fichier * .h qui affiche des données en vue de la table:

@interface TeamsTableViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource> 
{ 
    NSMutableArray *teamsArray; 
} 

J'allouer le tableau dans -viewDidLoad et la libération dans dealloc:

-(void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // Inititalize the mutablearray that will store the xml for the table. 
    teamsArray = [[NSMutableArray alloc] init]; 
} 

-(void)dealloc 
{ 
    [teamsArray release]; 

    [super dealloc]; 
} 

Chaque l'heure -viewWillAppear, j'appelle mon loadData pour recharger les données (parce que les données peuvent changer). Pour ce post (et comme j'essaie de localiser ma fuite), j'ai codé en dur les données. Le commentaire montre l'emplacement des fuites rapportées. (La fuite se produit lorsque la vue de la table est réaffichée.)

-(void)loadData 
{ 
    // Empty any objects that are already in the array. 
    [teamsArray removeAllObjects]; 

    // Fill a dictionary (normally looping through a file, but hardcoded for leak hunting). 
    NSMutableDictionary *oneTeamDictionary = [NSMutableDictionary dictionary]; 

    [oneTeamDictionary setObject:@"100"   forKey:@"basenumber"]; 
    [oneTeamDictionary setObject:@"Team Name" forKey:@"teamname"]; 
    [oneTeamDictionary setObject:@"XYZ"   forKey:@"teamabbr"]; 
    [oneTeamDictionary setObject:@"USA"   forKey:@"countryabbr"]; 
    [oneTeamDictionary setObject:@"Joe"   forKey:@"manager"]; 

    // Add this team to the array used to display table data. 
    [teamsArray addObject:[oneTeamDictionary copy]]; // Leaks Malloc 32 bytes and _NSCFDictionary 48 bytes here. 

    // Reload the table view with new data. 
    [self.tableView reloadData]; 
} 

Dans mon état newbieistic, je pense que [teamsArray release] libérerait l'objet dictionnaire. J'ai aussi essayé d'utiliser "alloc] init]" pour créer le dictionnaire, ainsi que libérer et réallouer le teamsArray (plutôt que d'appeler removeAllObjects).

+0

objets alloc dans viewDidLoad vous devez les libérer dans viewDidUnload. viewDidLoad et viewDidUnload peuvent être appelés plusieurs fois sur le même objet. – Marcio

Répondre

2

Le problème est la fonction de copie. Note de la documentation:

Considérations particulières

Si vous utilisez la mémoire gérée (non de collecte des ordures), cette méthode conserve le nouvel objet avant de le retourner. L'invocateur de la méthode, cependant, est responsable de la libération de l'objet retourné.

Pourquoi n'êtes-vous pas simplement appeler:

[teamsArray addObject:oneTeamDictionary]; 
0

Oui Jonas, vous avez raison. Si vous faites une copie de cet objet, vous devez relâcher l'objet. Sur retain, alloc, mutableCopy, Copy etc ... nous devons l'objet. Nous devons donc les libérer.

Si vous